4. ジョブの実行法

ここでは使用するアプリケーションの一例としてオープンソース電磁界シミュレーター OpenFDTD をとり、sbatchコマンドによりジョブを実行するためのスクリプトファイルを説明します。
他のアプリケーションではコマンド等を適当に置き換えてください。

4.1 CPUジョブの実行法

4.1.1 1ノードジョブの実行法

OpenMPを用いて1ノードで複数のスレッドで計算するときのスクリプトファイルは以下の通りです。
なお、行の先頭に"#"をつけるとコメント行になります。(SBATCH行のときは"##")

#!/bin/bash
#SBATCH -p f024h		(1)
#SBATCH -t 30			(2)
#SBATCH -J omp			(3)
#SBATCH -o stdout.%J		(4)

./ofd -n 40 data/benchmark/benchmark100.ofd	(5)
各行の意味は以下の通りです。
(1) 使用するパーティションを指定します。上の例はFシステムを用いて24時間以内で終わるジョブを表します。 パーティションは稼働状況、ジョブの性質、利用料金等を判断して選択してください。
(2) ジョブの最大予想時間を分単位で指定します。 必須ではありませんがジョブが予想外に長くなるときはジョブを中止して原因を調べた方がいいです。 なお、デバッグジョブのときはパーティションを"f006m"とし、本行を6分としてください。6分以内なら課金されません。
(3) ジョブ名を適当に与えてください。squeueコマンドで複数のジョブを区別するときに必要になります。
(4) 標準出力のコピーを保存します。%JはJOBID(7桁の数字)に置き換えられます。
(5) 実行コマンドを入力してください。OpenFDTDでは引数"-n"の後の数字でOpenMPのスレッド数を指定します。 Fシステムは1ノード40コアなので40コアを指定しています。 コア数に比例して速くなるとは限りませんが、ノード単位で課金されますので、最大値を指定しても構いません。

4.1.2 複数ノードジョブの実行法

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

#!/bin/bash
#SBATCH -p f024h	(1)
#SBATCH -N 2		(2)
#SBATCH -t 30		(3)
#SBATCH -J mpi		(4)
#SBATCH -o stdout.%J	(5)

module load MPI-openmpi-2.1.1+gnu-6.3.0+cuda-8.0	(6)
mpiexec -n 80 ./ofd_mpi data/benchmark/benchmark100.ofd	(7)
各行の意味は以下の通りです。
(1) 使用するパーティションを指定します。デバッグ用のパーティションは"f006m"です。
(2) 使用するノード数を指定します。
(3) ジョブの最大予想時間を分単位で指定します。
(4) ジョブ名を適当に与えてください。
(5) 標準出力のコピーを保存します。
(6) 開発時に使用したMPIのmoduleをloadします。
(7) 実行コマンドを入力してください。 mpiexecの引数"-n"の後の数字で総プロセス数を指定します。 Fシステムは1ノード40コアなので2ノードでは80プロセスを起動することができます。

4.2 GPUジョブの実行法

4.2.1 コンパイル・リンク法

FシステムにはGPU(Tesla P100, 3584コア, メモリー16GB)を持ったノードが2台あります。 GPUに対応したプログラムを高速に実行することができます。

ログイン
ログインサーバーから以下のコマンドでログインしてください。
$ ssh fgpu1
なお、GPUプログラムをバッチ処理で実行するだけのときは通常通り、以下で構いません。
$ ssh ff

CUDA
CUDAを用いてコンパイル・リンクを行うには最初にmoduleコマンドでCUDAを使用できるようにします。
$ module load PrgEnv-gnu-6.3.0
$ module load PrgEnv-cuda-9.2
以上でnvccが使用可能になりますので以下のコマンドで確認してください。
$ nvcc --version
makeコマンドで実行プログラムを作成します。
できた実行プログラムはコマンドラインでフロントエンドサーバーのGPU (Quadro P1000, 640コア, メモリー4GB) で動作確認を行ってください。

CUDA+MPI
複数のノードのGPUを使用するにはCUDAとMPIを使用してプログラムを作成します。
$ module load PrgEnv-gnu-6.3.0
$ module load PrgEnv-cuda-9.2
$ module load MPI-openmpi-2.1.1+gnu-6.3.0+cuda-8.0
Makefileが以下のようになっていることを確認してください。

makeコマンドで実行プログラムを作成します。
できた実行プログラムはコマンドラインでフロントエンドサーバーのGPU (Quadro P1000, 640コア, メモリー4GB) で動作確認を行ってください。

4.2.2 1ノードジョブの実行法

1ノードのGPUを使用するときのスクリプトファイルは以下の通りです。

#!/bin/bash
#SBATCH -p f072h_p100	(1)
#SBATCH -t 30
#SBATCH -J cuda
#SBATCH -o stdout.%J

./ofd_cuda data/benchmark/benchmark100.ofd
(1) デバッグ用のパーティションは"f006m_p100"です。

4.2.3 複数ノードジョブの実行法

複数ノードのGPUを使用するときのスクリプトファイルは以下の通りです。

#!/bin/bash
#SBATCH -p f072h_p100		(1)
#SBATCH -N 2			(2)
#SBATCH --ntasks-per-node=1	(3)
#SBATCH -t 30
#SBATCH -J cuda_mpi
#SBATCH -o stdout.%J

module load MPI-openmpi-2.1.1+gnu-6.3.0+cuda-8.0	(4)
mpiexec ./ofd_cuda_mpi data/benchmark/benchmark100.ofd 2> /dev/null	(5)
(1) デバッグ用のパーティションは"f006m_p100"です。
(2) 2ノードで計算することを表します。
(3) 各ノードで1プロセスを起動することを表します。複数ノードのGPUを使用するために必要です。
(4) 開発時に使用したMPIのmoduleをloadします。
(5) プロセス数は上で指定されていますのでここでは指定する必要はありません。

4.3 ベクトル計算機の使用法

4.3.1 コンパイル・リンク法

Vシステムにはベクトル計算機 NEC SX-Aurora TSUBASA (以下SX)が2ノードあります。
ソースコードがOpenMPによって並列化されており、かつアルゴリズムがベクトル化可能であれば、 コンパイラーの自動ベクトル化機能によってコンパイルするだけで高い性能を得ることができます。
使い方については NEC SDK を参考にしてください。

コンパイル・リンク・実行
$ ssh fvpu1 (当該マシンにloginする)
$ module load PrgEnv-nec (NEC C/C++をロードする)
$ module load MPI-nmpi (MPIを使用するとき必要)
$ ncc -O2 -fopenmp myprog.c (コンパイル・リンク)
$ ./a.out
Cコンパイラーのコマンドはnccです(C++はnc++)。
OpenMPを使用するときはコンパイルオプションとリンクオプションに"-fopenmp"が必要です。
コンパイルを行うとベクトル化と並列化に関する情報が表示されます。

自動並列化
NEC C/C++は強力な自動並列化機能を持っています。 OpenMPで並列化可能なコードの場合、 OpenMPを用いなくてもコンパイラーの自動並列化機能によって並列計算できる場合が少なくありません。 その場合コンパイルオプションとリンクオプションに"-mparallel"をつけて、 コンパイラーのメッセージで並列化の状態を確認した後実行してください。

4.3.2 1ノードジョブの実行法

1ノードを使用するときのスクリプトファイルは以下の通りです。

#!/bin/bash
#SBATCH -p v024h	(1)
#SBATCH -t 30
#SBATCH -J ncc
#SBATCH -o stdout.%J

./ofd_ncc -n 8 data/benchmark/benchmark100.ofd	(2)
(1) デバッグ用のパーティションは"v006m"です。
(2) SXは8コアから成るので"-n 8"でOpenMPが8コアを使用することを表します。

4.3.3 複数ノードジョブの実行法

複数ノードを使用するときのスクリプトファイルは以下の通りです。

#!/bin/bash
#SBATCH -p v024h
#SBATCH -N 2		(1)
#SBATCH -n 2		(2)
#SBATCH -t 30
#SBATCH -J ncc_mpi
#SBATCH -o stdout.%J

module load PrgEnv-nec			(3)
module load MPI-nmpi			(3)
NODEFILE=`generate_pbs_nodefile`		(4)
mpiexec -machinefile $NODEFILE ./ofd_ncc_mpi -n 8 data/benchmark/benchmark100.ofd	(4)
(1) 2ノードで計算することを表します。
(2) 2プロセスを起動することを表します。各ノードで1プロセスが起動されます。
(3) 開発時に使用した開発環境のmoduleをloadします。
(4) 使用するノードを指定します。