東京大学地震研究所地震火山情報センター

より高度な並列計算

通常は、同一CPUソケット上の最大6コアとローカルメモリを使用して、ジョブを実行しますが、 1スレッド(プロセス)に、より大きなメモリバンド幅を割り当てたい場合、1CPUソケットで使用するコア数を減らすことができます。
ここでは、「コア飛ばし」と呼ばれる、並列計算のジョブ実行方法を説明します。


コア飛ばし

例)16並列ジョブを各CPUで4コアづつ使用する場合
    4コア+4コア+4コア+4コア. 計4cpu24コアを占有することになります。
cpu0     cpu1     cpu2     cpu3
[■,■,■,■,空,空] [■,■,■,■,空,空] [■,■,■,■,空,空] [■,■,■,■,空,空]

 

通常の-nでの並列度以外に、-PでCPU毎にコアを幾つ使用するかを指定してください。
(-Pで指定するのは1~6のいずれかです。正しく指定しないと、正常にジョブが実行できません。)

※-Pオプションは地震研のシステムのみ有効です。他サイトでは使用できないため、ご注意ください。

 

-nで指定した並列度より、実際には多くのコア数を確保するため、いつも使用しているキューから
投入を拒否される場合があります。

主な並列度とキューの対応


並列度
1cpu毎の
コア数
キュー名
スクリプト
実際に確保する
CPU数(コア数)
8
4
C
#BSUB- q C
#BSUB -n 8
#BSUB -P 4
2(12)
16
4
C
#BSUB- q C
#BSUB -n 16
#BSUB -P 4
4(24)
32
4
D
#BSUB- q D
#BSUB -n 32
#BSUB -P 4
8(48)
64
4
E
#BSUB- q E
#BSUB -n 64
#BSUB -P 4
16(96)
128
4
F
#BSUB- q F
#BSUB -n 128
#BSUB -P 4
32(192)



MPI計算

  • 設定するもの
    #BSUB -n 並列数
    #BSUB -P cpuごとのコア数(1~6)
    source /opt/lsf/local/mpienv.csh [並列数] [cpu毎のコア数]・・・csh版
    (shの場合は. /opt/lsf/local/mpienv.sh [並列数] [cpu毎のコア数])
    mpirun -np 並列数 実行コマンドなど・・・・

32並列をcpuごとに4コア使用するMPI計算のスクリプト例(csh)です。

#!/usr/bin/csh
#BSUB -q D
#BSUB -n 32
#BSUB -P 4
#BSUB -o mpi4x8.out

source /opt/lsf/local/mpienv.csh 32 4

mpirun -np 32 ./xhpl < /dev/null >& out

#BSUB -Pに、CPUごとに使用するコア数4を指定します。
mpienv.cshに並列数、CPUソケットごとに4コアづつ指定しています。
mpirunの引数-npは実際に使用する並列度32を指定します。

shスクリプトの場合はsourceの行の代わりに
./opt/lsf/local/mpienv.sh 32 4
と書いてください。(先頭の.が必要です。)

コア飛ばしの場合、mpirunの後のdplaceは付けないで下さい。


ジョブを投入します。

sgiadm@eic:>bsub<./go.32-2
setLSB_SUB_MAX_NUM_PROCESSORSis48

Job<968>issubmittedtoqueue <D>.

 

sgiadm@eic:> bjobs
JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
968     sgiadm  RUN   D          eic         48*eicp1    * out.32-2 Feb  4 10:04


OpenMP計算

  • 設定するもの
    #BSUB -n 並列数
    #BSUB -P cpuごとのコア数(1~6)
    omplace -nt 並列数 -c 0-:bs=(cpu毎のコア数)+st=6 実行コマンドなど・・・・
または、
dplace -x2 -c (配置したいコア番号)

32並列をcpuごとに4コア使用するOpenMP計算のスクリプト例です。

#!/usr/bin/csh
#BSUB -q D
#BSUB -n 32
#BSUB -P 4
#BSUB -o out
set th=32
setenv OMP_NUM_THREADS ${th}
dplace -x2 0-3,6-9,12-15,18-21,24-27,30-33,36-39,42-45  ./para  >& out.para
または

omplace -nt ${th} -c 0-:bs=4+st=6 ./para >& out.para


#BSUB -Pに、CPUごとに使用するコア数4を指定します。

dplaceを指定するときには、コア番号を明示してください。
omplace -nt 32 -c 0-:bs=4+st=6では、並列度数32、いくつのコアを使用するか4を指定します。
(6は変更する必要はありません。)

 

投入すると、48コアを確保して実行します。

sgiadm@eic:> bsub < para32x4.csh
set LSB_SUB_NUM_PROCESSORS is 48

Job <1131> is submitted to queue <D>.


MPI+OpenMPハイブリッド型計算


32並列(8mpi×4スレッド)をcpuごとに4コアで計算する例です。
OpenMPのスレッド数とcpuごとに使用するコア数を一致させることを推奨します。

 

このように配置されます
 0       1     ・・・ 7        mpiプロセス番号
[0,0,0,0,空,空][1,1,1,1,空,空] ・・・[7,7,7,7,空,空] OpenMPスレッドが所属するMPIプロセス番号

  • 設定するもの
    #BSUB -n 並列数
    #BSUB -P cpuごとのコア数(1~6)
    setenv OMP_NUM_THREADS OpenMPスレッド数
    mpirun -np mpiプロセス数 omplace -nt OpenMPスレッド数 -c 0-:bs=(cpu毎のコア数)+st=6 実行コマンドなど・・・・

スクリプト例です。

#!/bin/csh -x
#BSUB -q C
#BSUB -n 32
#BSUB -P 4
#BSUB -o hy32-4.out

limit stacksize unlimited

set np=8
set th=4

setenv OMP_NUM_THREADS ${th}
mpirun -np ${np} omplace -nt ${th} -c 0-:bs=${th}+st=6 ./a.out

-nで並列数32、-Pに1cpu毎のコア数4を指定します。
npはMPIプロセス8、thはOpenMPでのスレッド数4を指定します。
その他の部分は特に修正する必要はありません。