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 ofd_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 ofd_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します。MPIの実装はたくさんありますので区別するために必要です。
(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 ofd_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 ofd_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します。MPIの実装はたくさんありますので区別するために必要です。
(5) プロセス数は上で指定されていますのでここでは指定する必要はありません。

4.3 NECスパコンの使用法

4.3.1 Vシステム

VシステムにはNECのスパコン NEC SX-Aurora TSUBASA (以下SX)のA100(1VE)が2ノードあります。
ソースコードがベクトル化と並列化に対応していれば、 コンパイラーの自動ベクトル化と自動並列化の機能によって、 コンパイルするだけで高い性能を得ることができます。
1ノードは1CPUから成り、ベクトル長256でベクトル計算し、8コアで並列計算します。
各ノードは48GBのHBM2メモリーを持っています。
使い方については NEC SDK を参考にしてください。

4.3.2 コンパイル・リンク法

コンパイル・リンク・実行
$ ssh fvpu1 (当該マシンにloginする)
$ module load PrgEnv-nec (NEC C/C++をロードする)
$ module load MPI-nmpi (MPIを使用するとき必要)
$ ncc -O2 myprog.c
$ ./a.out
Cコンパイラーのコマンドはncc、MPI対応のCコンパイラーのコマンドはmpinccです。

ベクトル化
ベクトル計算機を使用するには計算の主要部がベクトル化されていることが必須です。 コンパイル時のメッセージからベクトル化されていることを確認してください。 なお、ベクトル化のメッセージを非表示にするにはコンパイルオプションに "-fdiag-vector=0"を追加してください。

並列化
SXで並列化するにはOpenMPを使用する方法とコンパイラの自動並列機能を利用する方法の2通りがあります。
OpenMPを使用するときはコンパイルオプションとリンクオプションに"-fopenmp"を追加してください。
自動並列機能を使用するときはコンパイルオプションとリンクオプションに"-mparallel"を追加してください。
NEC C/C++の自動並列化は高い機能を持っており、 OpenMPで並列化可能なコードの多くは自動的に並列化することができます。 コンパイル時のメッセージから並列化されていることを確認してください。 なお、並列化のメッセージを非表示にするにはコンパイルオプションに "-fdiag-parallel=0"を追加してください。

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

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

#!/bin/bash
#SBATCH -p v024h	(1)
#SBATCH -t 30
#SBATCH -J ofd_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.4 複数ノードジョブの実行法

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

#!/bin/bash
#SBATCH -p v024h
#SBATCH -N 2		(1)
#SBATCH -n 2		(2)
#SBATCH -t 30
#SBATCH -J ofd_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) 使用するノードを指定します。

4.3.5 Wシステムでの実行法

WシステムにはSXのA300(8VE)モデルが1台あります。
複数のVE間はMPIで並列計算します。
Wシステムにログインするにはログインサーバーから以下でログインしますが、 コンパイル作業は上記のVシステムでもできます。
$ ssh ff
$ ssh fvpu2 (パスワードが必要、利用開始時にFOCUSから与えられたパスワード)
プログラムの実行はフロントエンドサーバーffから以下のスクリプトで実行できます。
ここで"-ve 0-7"はve0からve7までの8VEをすべて使用することを表します。 8VEを使用することによって1VEの8倍近く速くなります。

#!/bin/bash
#SBATCH -p w024h
#SBATCH -t 30
#SBATCH -J ofd_w
#SBATCH -o stdout.%J

module load PrgEnv-nec			(3)
module load MPI-nmpi			(3)
mpiexec -ve 0-7 -n 8 ./ofd_ncc_mpi -n 8 data/benchmark/benchmark100.ofd	(4)

4.4 富士通スパコンの使用法

4.4.1 Xシステム

Xシステムには富士通のスパコン Fujitsu Supercomputer PRIMEHPC (以下FX)のFX700モデルが2ノードあります。
1ノードは1CPUから成り、1CPUは48コアから成り、それぞれ512ビットSIMDベクトル演算器を持っています。
OpenMPは多スレッド時の性能が落ちるので実用上はMPIと併用する必要があります。 CPUが4ブロックから成るのでMPI4プロセス、OpenMP12スレッドを推奨します。
SIMDベクトル化はコンパイラーの自動ベクトル化を使用します。
各ノードは32GBのHBM2メモリーを持っています。

4.4.2 コンパイル・リンク法

Xシステムにログインするにはログインサーバーから以下でログインします。
$ ssh ff
$ ssh fx01 または
$ ssh fx02 (パスワードが必要、利用開始時にFOCUSから与えられたパスワード)
コンパイラーを使用するには最初に.bash_profileに以下の環境変数を設定します。
export PATH=/opt/FJSVstclanga/v1.1.0/bin:$PATH
export LD_LIBRARY_PATH=/opt/FJSVstclanga/v1.1.0/lib64:$LD_LIBRARY_PATH

コンパイル・リンク・実行は以下の通りです。
$ fcc -Kfast myprog.c
$ ./a.out
Cコンパイラーのコマンドはfcc、MPI対応のCコンパイラーのコマンドはmpifccです。

4.3.3 MPIプログラムの実行法

MPIプログラムを使用するときのスクリプトファイルは以下の通りです。
現状ではジョブはフロントエンドサーバーffから発行する必要があります。

#!/bin/bash
#SBATCH -p x024h
#SBATCH -t 30
#SBATCH -J ofd_fcc_mpi
#SBATCH -o stdout.%J

mpiexec -n 4 ./ofd_fcc_mpi -n 12 data/benchmark/benchmark100.ofd	(1)
(1) MPI4プロセス、OpenMP12スレッドのとき最も速くなります。