==================================
計算を実行する
==================================
スーパーコンピューティングシステムで計算を実行する方法を説明します。
:doc:`/getting_started/login_to_system` が完了していることを前提とします。
MASAMUNE-弐では `PBS Professional `_ ジョブスケジューラによるジョブ管理の仕組みを導入しています。
ユーザーは実行したい計算をジョブスクリプトとして記述し、利用したい計算資源に応じたキュー(待ち行列)に投入します。
各ユーザーから投入されたジョブは、ジョブスケジューラが決定した実行優先度順に計算資源が割り当てられ実行されます。
ジョブの実行優先度は予約された計算資源量やユーザー毎の過去の資源使用量に基づき、なるべくユーザー間で公平に、かつ効率的にジョブが実行されるよう決定されます。
詳細については :doc:`/job/job_exe_order` を参照してください。
概要
====
計算を実行するには、通常以下の手順を行います。
1. 計算プログラムのソースコードをコンパイルする
2. プログラムを実行するためのジョブスクリプトを作成する
3. ``qsub`` コマンドでジョブを投入する
.. note::
MASAMUNE-弐には多くの材料科学計算アプリケーションが予めインストールされており、コードをご自身でコンパイルすることなくご利用いただくことも可能です。
:doc:`/app/app_list` の各アプリケーションのページでジョブスクリプト例をご確認いただけます。
ジョブスクリプト
-----------------------
ジョブはシェルスクリプト形式で以下のように記述します。
.. code-block:: none
#!/bin/sh
#PBS -l select=1:ncpus=1:mem=4gb
#PBS -q queue_name
#PBS -N job_name
(以下、実行するプログラムの指定など)
スクリプト2~4行目の"#PBS"から始まる行では、計算資源の予約やキューの指定、ジョブ名の設定を行っています。
詳細については :doc:`/job/command/exe_job` 等を参照してください。
サンプルプログラムの実行手順
===================================
ここでは、C言語のHello Worldプログラムをコンパイルし、ジョブとして実行する手順を説明します。
ソースコードの作成とコンパイル
--------------------------------
まず、以下の内容で ``hello.c`` という名前のファイルを作成します。
.. code-block:: none
#include
int main(void) {
printf("Hello world!\n");
return 0;
}
次に、コンパイラを用いてプログラムをコンパイルし、実行ファイル ``hello`` を作成します。
今回はGNUコンパイラ(gcc)を使用します。
.. code-block:: none
$ gcc hello.c -o hello
.. note::
MASAMUNE-弐にはGNUコンパイラの他にもIntelコンパイラ、NVIDIA HPCコンパイラ、CUDA toolkitがインストールされています。
ご利用方法につきましては、 :doc:`/compiler_lib/compiler_lib` をご確認ください。
ジョブスクリプトの作成
-----------------------------
次に、作成したプログラムをキューに投入するためのジョブスクリプトを作成します。
以下の内容で、 ``hello.sh`` という名前のファイルを作成してください。
このスクリプトは、キュー ``CP_001`` に "hello" という名前のジョブを投入し、先ほど作成した ``hello`` プログラムを実行します。
.. code-block:: none
#!/bin/sh
#PBS -l select=1:ncpus=1:mem=4gb
#PBS -q CP_001
#PBS -N hello
# ジョブを投入したディレクトリに移動
cd ${PBS_O_WORKDIR}
# 標準出力を result.out、標準エラー出力を result.err にリダイレクトする
./hello > result.out 2> result.err
スクリプトの書式に関する詳細は :doc:`/job/command/script` などを参照してください。
ジョブの投入
------------------
スクリプトを作成したら、以下のように ``qsub`` コマンドでジョブを投入します。
ジョブの投入に成功すると、ジョブID(この場合は ``123456.cmspbs1`` )が表示されます。
.. code-block:: none
$ qsub hello.sh
123456.cmspbs1
ジョブの状態は ``statj`` コマンドで確認できます。
.. code-block:: none
$ statj
sdb:
Req'd Req'd Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time
--------------- -------- -------- ---------- ------ --- --- ------ ----- - -----
123456.cmspbs1 sc-user CP_001 hello -- 1 1 4gb 24:00 Q --
それぞれの項目の意味は以下のとおりです。
.. list-table::
:widths: 30 70
:header-rows: 1
* - 項目
- 意味
* - Job ID
- ジョブに割り当てられたID
* - Username
- ユーザ名
* - Queue
- ジョブが投入されたキュー名
* - Jobname
- ジョブ名
* - SessID
- セッションID
* - NDS
- 占有ノード数
* - TSK
- CPUコア数
* - Req'd Memory
- 使用可能メモリ上限
* - Req'd Time
- 実行時間上限
* - S
- ジョブの状態 |br| Q: 実行待ち |br| R: 実行中 |br| E: 実行終了処理中 |br| H: ホールド
* - Elap Time
- ジョブ実行開始からの経過時間
.. |br| raw:: html
ジョブが終了すると、名前が ``{ジョブ名}.o{ジョブID}`` および ``{ジョブ名}.e{ジョブID}`` のファイルがジョブ投入時のディレクトリに出力されます。
これらのファイルにはそれぞれジョブ実行中の標準出力および標準エラー出力の内容が記録されます。
.. code-block:: none
result.out
result.err
hello.o123456
hello.e123456
今回はそれぞれの出力を ``result.out`` および ``result.err`` にリダイレクトしているため、 ``hello.o123456`` および ``hello.e123456`` の内容は空になっているはずです。
.. attention::
標準出力および標準エラー出力に計算結果などを大量に出力するプログラムを実行する場合、必ず出力内容をファイルにリダイレクトしてください。
リダイレクトされない出力内容はPBSの一時ファイル保管領域に保存されるため容量枯渇の原因となり、他のユーザのジョブ実行に影響します。
そのため、上記の注意事項をお守りいただけない場合、当該ジョブを強制的にキャンセルさせていただく場合がございます。
出力結果を見てみましょう。以下のように出力されていれば、正常にプログラムが実行されています。
.. code-block:: none
$ cat result.out
Hello world!
何も出力されない、もしくは出力がおかしい場合は、標準エラー出力にエラーメッセージが出ていないかご確認ください。
.. code-block:: none
$ cat result.err
MASAMUNE-弐での計算の実行方法の説明は以上です。
より詳細なご利用方法につきましてはユーザーマニュアルの各章をご確認ください。
参考資料
==============
- :doc:`/job/exe_job`
- :doc:`/compiler_lib/compiler_lib`
- :doc:`/app/how_to_use_app`