KOBE HPC サマースクール(初級)2023 講義12

482 Views

November 21, 23

スライド概要

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

KOBE HPC サマースクール 2023(初級) 11. 熱伝導問題の並列計算 12.ハイブリッド並列 2023/9/21 KOBE HPCサマースクール 2023 1

2.

2次元定常熱伝導問題 2次元正方形領域 [0,1]×[0,1] に一定の熱を加え続けた時の領域の温度がどうな 境界で0.0 るか? 𝜕2𝑢 𝜕2𝑢 ∆𝑢 + 10 = + 2 + 10 = 0 2 𝜕𝑥 𝜕𝑦 境界条件 2023/9/21 𝑢 0, 𝑦 = 0.0 (0 ≤ 𝑦 ≤ 1) 𝑢 1, 𝑦 = 0.0 (0 ≤ 𝑦 ≤ 1) 𝑢 𝑥, 0 = 0.0 (0 ≤ 𝑥 ≤ 1) 𝑢 𝑥, 1 = 0.0 (0 ≤ 𝑥 ≤ 1) KOBE HPCサマースクール 2023 2

3.

離散化格子と変数 𝑥方向,𝑦方向どちらも 𝑁 + 1 等分する.ℎ = 1/ 𝑁 + 1 𝑦 𝑢𝑖,𝑗 ≜ 𝑢 𝑖ℎ, 𝑗ℎ 𝑖, 𝑗 = 0, 1, 2, … , 𝑁 + 1 𝑢𝑁,𝑁+1 𝑢0,𝑁+1 ℎ ℎ 境界条件として既知の値 内部の格子点(未知数) 𝑢𝑖,𝑗 𝑢0,𝑗 𝑢0,1 𝑢1,1 𝑢0,0 𝑢1,0 2023/9/21 内部の格子点に関する関係式を作る. 𝑢2,1 𝑢2,0 𝑢𝑖,0 𝑢𝑁+1,0 𝑥 KOBE HPCサマースクール 2023 3

4.
[beta]
熱伝導問題へのヤコビ法の適用
反復ベクトル生成のアルゴリズム
for( i=1; i<=N; i++ ) {
for( j=1; j<=N; j++ ) {
ui,j(m+1) = (ui-1,j(m)+ui+1,j(m)+ui,j-1(m)+ui,j+1(m))*0.25 + 10.0*dx*dx;
};
};

2023/9/21

KOBE HPCサマースクール 2023

4

5.

演習11-1 :プログラム heat2d.c の実行 2次元定常熱伝導問題の逐次プログラム heat2d.c をコンパイルして実 行せよ. $ $ $ cp /home/guest60/share/heat2d.c ./ Icc –O3 heat2d.c ./a.out [Fortran] $ cp /home/guest60/share/heat2d.f90 ./ $ ifort –O3 heat2d.f90 $ ./a.out プログラムでは N = 128 の時に,反復ベクトルの差の m+1 m ノルム 𝑢𝑖,𝑗 − 𝑢𝑖,𝑗 がある閾値𝜖 = 1.0 × 10−3 より 2 小さくなったら反復を停止している. プログラム実行が正常に完了したら「To visualize data,…」というメッセージが 出てくる.これの指示に従うと計算結果を図示できる(gnuplot と X11 が必要. 事前に「module load gnuplot」で gnuplot 使用環境を load しておく). 2023/9/21 KOBE HPCサマースクール 2023 5

6.

heat2d.c のMPIによる並列化(Cの場合) 並列化のヒント 1. 2次元配列 u(𝑢𝑚 ),u_new(𝑢𝑚+1 )をブロック行分割しておく. 2. u[is:ie][] の計算をする前に, - 上のプロセスの u の ie 行を下のプロセスの (is-1) 行へ, - 下のプロセスの u の is 行を上のプロセスの (ie+1) 行へ, 送る. 並列化 sr_matrix.c を参考にして,MPI_Sendrecv を用いて送受信. 3. u の is ~ ie 行の計算を行う.計算結果は u_new に格納. 4. 反復ベクトルの差のノルムの部分和を計算し, MPI_Allreduce で総和を取り,収束の判定を行うようにする. 上下のプロセスから1行を受信 (受信用の領域を確保しておく) ローカルで残差の部分和を計算し,各プロセスでノルムを計算する. 5. 2023/9/21 u_new を u に入れなおして,手順2に戻る. KOBE HPCサマースクール 2023 6

7.

heat2d.f90 のMPIによる並列化(Fortranの場合) 並列化のヒント 1. 2次元配列 u(𝑢𝑚 ),u_new(𝑢𝑚+1 ) をブロック列分割しておく. 2. U(:,js:je) の計算をする前に, - 左のプロセスの u の je 列を右のプロセスの (js-1) 列へ, 左右のプロセスから1行を受信 - 右のプロセスの u の js 列を左のプロセスの (je+1) 列へ, (受信用の領域を確保しておく) 送る. 並列化 sr_matrix.f90 を参考にして,MPI_Sendrecv を用いて送受信. 3. u の js ~ je 列の計算を行う.計算結果は u_new に格納. 4. 反復ベクトルの差のノルムの部分和を計算し, MPI_Allreduce で総和を取り,収束の判定を行うようにする. ローカルで残差の部分和を計算し,各プロセスでノルムを計算する. 5. 2023/9/21 u_new を u に入れなおして,手順2に戻る. KOBE HPCサマースクール 2023 7

8.

Cの場合の処理の イメージ ※Fortranの場合は これを横に寝かした ようなイメージに なる 2023/9/21 rank #0 #0がupdateす べき計算格子 rank #1 #1がupdateす べき計算格子 rank #2 #2がupdateす べき計算格子 rank #3 #3がupdateす べき計算格子 KOBE HPCサマースクール 2023 8

9.

Cの場合の処理の イメージ #1はこの範囲の 格子点データを 持つようにする. ※Fortranの場合は rank #0 これを横に寝かした ようなイメージに rank #1 なる rank #2 #2はこの範囲の 格子点データを 持つようにする. rank #3 2023/9/21 KOBE HPCサマースクール 2023 9

10.

演習11-2 heat2d.{c/f90} の並列化 heat2d.c,heat2d.f90 をMPIを用いて並列化せよ. 計算結果を gnuplot 等で図示し,非並列版と同じ結果 になることを確認せよ. 計算結果の出力は,プロセス 0 にデータを集め※, ファイルに出力する. 集め方(通信の仕方)は複数ある.考えてみよ. N=128とし,プロセス数1, 2, 4, 8 として,反復開始から終了までの計算時間を計 測し,速度向上率を求めよ.また,それをグラフにせよ. 時間計測時は反復計算途中データのファイル出力を OFF にすると良い. プログラム中のパラメータ INTV の値を 1 にするとデータのファイル出力が抑制される. ファイル出力がないので,通信によるデータの収集(上述の※)も反復計算中は必要ない. 2023/9/21 KOBE HPCサマースクール 2023 10

11.

演習12-1 ハイブリッド並列化 MPI を用いて並列化した heat2d.{c/f90} に,さらに OpenMP のディレクティブ を挿入し,スレッド並列とプロセス並列の併用により,実行時間が削減されるこ かどうか確認せよ. #pragma omp parallel などを利用する(C言語). 冒頭で omp.h をインクルードするのを忘れずに(C言語). !$OMP parallel などを利用する(Fortran言語). 冒頭で !$ use omp_lib を宣言するのを忘れずに(Fortran言語). 一般にハイブリッド並列はプロセス・スレッド並列単体より高度な並列実装であるが,速度上の メリットが得られるかどうかは,計算の内容や計算機の仕様に依存する. コンパイル icc –qopenmp xxxxx.c –lmpi ifort –qopenmp xxxxx.f90 -lmpi 2023/9/21 KOBE HPCサマースクール 2023 11

12.

【サンプル】Hybrid並列プログラムの実行シェル(jobh.sh) #!/bin/bash #PBS #PBS #PBS #PBS -N -q -j -l ジョブ名の指定 キューの設定:スクール専用キューWS hybrid WS oe select=4:ncpus=16:mpiprocs=2 select: 計算ノード数 ncpus : 1計算ノード内のコア数 mpiprocs: 1計算ノード内のMPIプロセス数 source /etc/profile.d/modules.sh module load intel module load mpt export KMP_AFFINITY=disabled export OMP_NUM_THREADS=8 cd ${PBS_O_WORKDIR} mpiexec_mpt omplace -nt ${OMP_NUM_THREADS} ./a.out 2023/9/21 KOBE HPCサマースクール 2023 12

13.

#PBS -l select=N:ncpus=T:mpiprocs=M T: M: N: NM: 1ノード(共有メモリ)のコア数(≦40) 1ノードのMPIプロセス数 全ノード数 全MPIプロセス数 例えば,コア数を 16,全MPIプロセスを 8 とすると,以下のようなマッピングが考えられる.この 場合, スレッド #PBS -l select=4:ncpus=16:mpiprocs=2 ノード 2023/9/21 KOBE HPCサマースクール 2023 13

14.

上級者になるために... 大規模問題を解く場合には,1プロセスのメモリ使用容量を少なくする必要が出てくる. 今回のプログラムでは,どのプロセスも u[N+2][N+2], u_new[N+2][N+2] として,計算全領域の 変数を宣言したが, 外側の領域 PE0 u[N/nprocs+2][N+2] u_new[N/nprocs][N+2] 各プロセスは,これだけの大きさをもてば良いはず. 実行前から並列数(nprocs)が固定されていれば,上記のように,プログラムの先頭で小さい領 域を宣言することも出来るが,汎用のプログラムとしては,nprocs を実行開始時に決めたい. 配列を動的に確保する必要がある(C言語:malloc 関数、Fortran言語:allocate文) . サンプルプログラム /home/guest60/share/alloc_heat2d.c もしくは alloc_heat3d.f90 2023/9/21 KOBE HPCサマースクール 2023 14