3. 使用方法

ここでは使用方法について最低限必要な事項を説明します。
詳しくは FOCUSスパコン利用の手引き を参考にして下さい。

3.1 環境設定

標準のshellはbashです。
エディタはvimまたはemacsが使用できます。
必要なら、ホームディレクトリの以下のファイルを編集して下さい。

3.2 フロントエンドサーバーの作業内容

フロントエンドサーバーで以下の作業を行います。

  1. ソースコードの修正(必要なら)
  2. コンパイル・リンク
  3. 小さいジョブによるデバッグ作業とチューニング作業 (注1)
  4. ジョブ発行、ジョブ確認 (注2)
  5. 計算結果のログの確認
(注1)
通常のコマンドラインで実行プログラムを起動することができ課金されませんが、 計算時間(=1分)、プロセス数(=1)、メモリー(=1GB)等の制約があり、 簡単なテストのみを行うことができます。それ以上の計算はジョブを発行して行ってください。
(注2)
sbatchコマンドでジョブを発行し使用時間に応じて課金されます。 ただし、各システムにはデバッグ用のパーティションが用意されており、 それを用いると6分以内のジョブは課金されません(平成29年度現在)。

3.3 ソースコードと入力データの転送

WinSCPを用いてOpenFDTDの以下のディレクトリーのソースコードとMakefileを転送して下さい。

(注1)
後に述べるようにマルチスレッドプログラムはオーバーヘッドが大きくて速度が出ないので省略しても構いません。
(注2)
EシステムはXeonPhiを備えていますがネイティブモードは時間占有時に限定されますのでここでは扱いません。
(注3)
CUDAとOpenCLはサポートしないので不要です。

その他、必要ならdataフォルダのサンプルデータを転送して下さい。
計算に用いる入力データはローカル環境で作成し、 図形表示により正しく入力されていることを十分確認した後FOCUSに転送して下さい。
コンパイル・リンク方法についてはOpenFDTDのページのLinux版と同じです。 コンパイラーやコンパイルオプションについては次章で説明します。

3.4 稼働状況コマンド

稼働状況を調べるコマンドは以下の通りです。
$ sinfo -s (A:割り当てられているノード数、I:使用可能なノード数)
$ freenodes (右の数字:割り当てられているノード数、左の数字:使用可能なノード数)
$ squeues (RUN:使用中のノード数、FREE:使用可能なノード数)
$ thismonth または uacct (今月の利用料金が表示されます)

3.5 ジョブ関係コマンド

ジョブ関係のコマンドは以下の通りです。
$ sbatch スクリプトファイル名 (ジョブの発行)
$ squeue (ジョブの実行状況の監視、自分の発行したジョブのみ)
$ scancel キュー番号 (ジョブの取り消しまたは中止、キュー番号はsqueueコマンドで表示される)

3.6 ジョブスクリプトファイル

(1) 1ノード使用時
OpenMPを用いて1ノードで複数のスレッドで計算するときのスクリプトファイルは以下の通りです。

#!/bin/bash
#SBATCH -p d006h	(1)
#SBATCH -n 1		(2)
#SBATCH -c 20		(3)
#SBATCH -t 30		(4)
#SBATCH -J ofd		(5)
#SBATCH -o stdout.%J	(6)
#SBATCH -e stderr.%J	(7)

export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK}	(8)
./ofd_omp_gcc data/benchmark/benchmark2.ofd	(9)
各行の意味は以下の通りです。
(1) 使用するパーティションを指定します。ここではDシステムを選択しています。 稼働状況等を判断して選択して下さい。
(2) 使用するノード数は1です。
(3) Dシステムは1ノード20コアなので20コアを指定します(Aシステムは12コア)。 コア数に比例して速くなるとは限りませんが、ノード単位で課金されますので、最大値を指定しても構いません。
(4) ジョブの最大時間を分単位で指定します。 必須ではありませんがジョブが予想外に長くなるときはジョブを中止して原因を調べた方がいいです。
(5) ジョブ名を適当に与えて下さい。複数のジョブを区別するときに必要になります。
(6) 標準出力のコピーを保存します。%JはJOBID(6桁の数字)に置き換えられます。
(7) 標準エラーのコピーを保存します。
(8) OpenMPのスレッド数を環境変数に設定します。(3)で指定した値を取得します。
(9) 実行コマンドを入力して下さい。 なお、(3)(8)を削除して引数 "-n スレッド数" でスレッド数を指定することも可能です。

(2) 複数ノード使用時
MPIを用いて複数ノードで計算するときのスクリプトファイルは以下の通りです。

#!/bin/bash
#SBATCH -p d006h	(1)
#SBATCH -n 100		(2)
#SBATCH -t 30		(3)
#SBATCH -J ofd		(4)
#SBATCH -o stdout.%J	(5)
#SBATCH -e stderr.%J	(6)

module load gnu/openmpi165	(7)
mpiexec -n ${SLURM_NTASKS} ./ofd_mpi_gcc data/benchmark/benchmark2.ofd	(8)
各行の意味は以下の通りです。
(1) 使用するパーティションを指定します。ここではDシステムを選択しています。 稼働状況等を判断して選択して下さい。
(2) 起動するプロセス数を指定します。 Dシステムは1ノード20コアなので100プロセスを指定すると5ノードを使用することになります(Aシステムは12コア)
(3) ジョブの最大時間を分単位で指定します。 必須ではありませんがジョブが予想外に長くなるときはジョブを中止して原因を調べた方がいいです。
(4) ジョブ名を適当に与えて下さい。複数のジョブを区別するときに必要になります。
(5) 標準出力のコピーを保存します。%JはJOBID(6桁の数字)に置き換えられます。
(6) 標準エラーのコピーを保存します。
(7) 開発時に使用したMPIのmoduleを指定します。詳しくは次節で説明します。
(8) 実行コマンドを入力して下さい。 (2)で指定したプロセス数を環境変数を通して使用しています。
なお、(2)を削除して引数 "-n プロセス数" でプロセス数を直接指定することも可能です。

3.7 計算結果の取得

計算結果は以下のようにして確認します。