ここでは使用するアプリケーションの一例としてオープンソース電磁界シミュレーター
OpenFDTD
をとり、sbatchコマンドによりジョブを実行するためのスクリプトファイルを説明します。
他のアプリケーションではコマンド等を適当に置き換えてください。
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)各行の意味は以下の通りです。
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)各行の意味は以下の通りです。
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が以下のようになっていることを確認してください。
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"です。
複数ノードの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"です。
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"をつけて、
コンパイラーのメッセージで並列化の状態を確認した後実行してください。
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"です。
複数ノードを使用するときのスクリプトファイルは以下の通りです。
#!/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ノードで計算することを表します。