KOBE HPC サマースクール 2020（初級）11. 熱伝導問題の並列計算（ハイブリッド並列）

2020/9/9

KOBE HPC サマースクール 20201

2次元定常熱伝導問題
2次元正方形領域 [0,1]×[0,1] に一定の熱を加え続けた時の領域の温度がどうなるか？
境界で0.0

境界条件

2020/9/9𝑢 0, 𝑦0.0

0𝑦1𝑢 1, 𝑦0.00𝑦

1𝑢 𝑥, 00.00𝑥

1𝑢 𝑥, 10.00𝑥

1

KOBE HPC サマースクール 20202

離散化格子と変数𝑥方向，𝑦方向どちらも 𝑁

1 等分する．ℎ

1/ 𝑁

1𝑢 , ≜ 𝑢 𝑖ℎ, 𝑗ℎ𝑦𝑖, 𝑗0, 1, 2, … , 𝑁

1𝑢 ,𝑢 ,ℎℎ境界条件として既知の値
内部の格子点（未知数）𝑢,𝑢 ,𝑢,𝑢 ,𝑢 ,2020/9/9𝑢,

内部の格子点に関する関係式を作る．

𝑢 ,𝑢 ,𝑢,𝑢𝑥,

KOBE HPC サマースクール 20203熱伝導問題へのヤコビ法の適用
反復ベクトル生成のアルゴリズム
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;};};

2020/9/9

KOBE HPC サマースクール 20204

演習11-1 ：プログラム heat2d.c の実行
2次元定常熱伝導問題の逐次プログラム heat2d.c をコンパイルして実行せよ．
$$$

cp /tmp/Summer/M‐4/heat2d.c ./icc –O3 heat2d.c./a.out

プログラムでは N 128 の時に，反復ベクトルの差のノルム 𝑢 ,𝑢,がある閾値𝜖 1.0 10 より小さくなったら反復を停止している．

2020/9/9

KOBE HPC サマースクール 20205

heat2d.c のMPIによる並列化
並列化のヒント
2次元配列 u，u0 をブロック行分割
u の計算をする前に，u[is:ie][]をu0にコピーし，- 上のプロセスのu0の ie 行を下のプロセスの (is-1) 行へ，- 下のプロセスのu0の is 行を上のプロセスの (ie+1) 行へ，送る．
並列化sr_matrix.c と同様に，MPI_Sendrecv を用いて送受信
u の is ～ ie 行の計算を行う.

上下のプロセスから1行を受信（受信用の領域を確保しておく）

反復ベクトルの差のノルムの部分和を計算し，MPI_Allreduceで総和を取り，収束の判定を行うようにする．
ローカルで残差の部分和を計算し，各プロセスでノルムを計算する．
2020/9/9

KOBE HPC サマースクール 2020

6rank #0#0がupdateすべき計算格子rank #1#1がupdateすべき計算格子rank #2#2がupdateすべき計算格子rank #3#3がupdateすべき計算格子2020/9/9

KOBE HPC サマースクール 20207

#1はこの範囲の格子点データを持つようにする．

rank #0

rank #1

rank #2#2はこの範囲の格子点データを持つようにする．

rank #3

2020/9/9

KOBE HPC サマースクール 20208

演習11-2 heat2d.cの並列化
heat2d.cをMPIを用いて並列化せよ．
N=128とし，プロセス数1, 2, 4, 8 として，反復開始から終了までの計算時間を計測し，速度向上率を求めよ．また，それをグラフにせよ．
計算結果を gnuplotなどで図示せよ．
計算結果の出力は，プロセス0にデータを集め，ファイルに出力する．

2020/9/9

KOBE HPC サマースクール 2020

9演習11-3 ハイブリッド並列化
MPIを用いて並列化したheat2d.cに，さらにopenMPのディレクティブを挿入し，タスク並列とプロセス並列によりさらに実行時間が削減されることを確認せよ．
#pragma omp parallel を利用する．
omp.h をインクルードするのを忘れずに．

コンパイル
icc –qopenmp xxxxx.c ‐lmpi

2020/9/9

KOBE HPC サマースクール 202010

【サンプル】Hybrid並列プログラムの実行シェル#!/bin/bash#PBS ‐N hybrid#PBS ‐q S#PBS ‐j oe#PBS ‐l select=2:ncpus=4:mpiprocs=2
source /etc/profile.d/modules.shmodule load intel
module load mpt

ジョブ名の指定

select:
計算ノード数ncpus :
1計算ノード内のコア数
mpiprocs: 1計算ノード内のMPIプロセス数

export KMP_AFFINITY=disabledexport OMP_NUM_THREADS=2
cd ${PBS_O_WORKDIR}
mpiexec_mpt omplace ‐nt ${OMP_NUM_THREADS} ./a.out

2020/9/9

KOBE HPC サマースクール 202011上級者になるために．．．
大規模問題を解く場合には，1プロセスのメモリ使用容量を少なくする必要が出てくる．
今回のプログラムでは，どのプロセスも u[N+2,N+2], u0[N+2,N+2] として，計算全領域の変数を宣言したが，外側の領域

PE0

u[N/nprocs][N+2]u0[N/nprocs+2][N+2]

各プロセスは，これだけの大きさをもてば良いはず．

実行前から並列数（nprocs）が固定されていれば，上記のように，プログラムの先頭で小さい領域を宣言することも出来るが，汎用のプログラ
ムとしては，nprocsを実行開始時に決めたい．
配列を動的に確保する必要がある（malloc関数） ．
サンプルプログラム /tmp/Summer/M-4/alloc_mpi_heat2d.c
2020/9/9

KOBE HPC サマースクール 202012

補足：2次元定常熱伝導問題の離散化

2020/9/9

KOBE HPC サマースクール 202013

𝑢 , を辞書式順序で並べたベクトルを𝒖とすると，点 𝑖, 𝑗 に関する離散式は𝑢,𝒖

2020/9/9𝑢,𝑢 ,𝑢 ,⋮𝑢 ,𝑢,𝑢 ,𝑢 ,
⋮𝑢 ,
⋮
⋮
𝑢,
⋮𝑢,
⋮𝑢 ,
⋮
⋮
𝑢,𝑢 ,𝑢 ,⋮𝑢 ,𝑢,4𝑢 ,0𝑢

⋯

𝑢,,1

⋯

1

N離れている

10 ℎ

4 1 ⋯

1 0

N離れている

KOBE HPC サマースクール 2020

𝑖, 𝑗⋯

1, 2, … , 𝑁

0𝑢,𝑢 ,𝑢 ,⋮𝑢 ,𝑢,𝑢 ,𝑢 ,⋮𝑢 ,⋮⋮𝑢,
⋮𝑢,
⋮𝑢 ,
⋮
⋮
𝑢,𝑢 ,𝑢 ,⋮𝑢 ,14

行列を用いた表現

2020/9/9

KOBE HPC サマースクール 202015

連立一次方程式の反復解法

2020/9/9

KOBE HPC サマースクール 2020

16

行列分離

００００
行列分離：

＝: 対角行列: 狭義下三角行列: 狭義上三角行列

2020/9/9

KOBE HPC サマースクール 202017

ヤコビ法（その1）ヤコビ行列

で，反復ベクトル系列を生成する．

𝑥𝑎 𝑥𝑏/𝑎𝑛, 𝑚0,1

2020/9/9𝑖

KOBE HPC サマースクール 2020

18

yy

1

1
(i,j+1)(i-1,j)(i,j)(i,j+1)(i+1,j)(i-1,j)(i,j-1)0(i+1,j)(i,j-1)

1x0

反復 m2020/9/9

(i,j)

1x

反復 m+1

KOBE HPC サマースクール 2020

19

4 -1
-1 4 -1-1 4 -1-1-1-1-1 4 -1-1 4-1-1-1-14 -1-1 4 -1-1 4 -1-1-1-1-1-1 4 -1-1 4-1-1-1-1-14 -1-1 4 -1-1 4 -1-1-1
2020/9/9-1-1

KOBE HPC サマースクール 2020

-1 4 -1-1 4𝑢,𝑢 ,𝑢 ,⋮𝑢 ,𝑢,𝑢 ,𝑢 ,
⋮𝑢 ,
⋮⋮
𝑢,
⋮𝑢,
⋮𝑢 ,
⋮⋮
𝑢,𝑢 ,𝑢 ,⋮𝑢 ,𝑏,𝑏,𝑏,⋮𝑏 ,𝑏,𝑏,𝑏,
⋮𝑏 ,
⋮⋮
𝑏,
⋮𝑏,⋮𝑏 ,⋮⋮𝑏,𝑏,𝑏,⋮𝑏 ,20