OpenMPによるマルチコア・
メニィコア並列プログラミング入門
Fortran編
第Ⅱ部：OpenMP

中島研吾
東京大学情報基盤センター

2• OpenMP• Login to OBCX• Parallel Version of the Code by OpenMP• STREAM• Data Dependency

3

Hybrid並列プログラミング• スレッド並列＋メッセージパッシング– OpenMP+ MPI– CUDA + MPI, OpenACC + MPI• OpenMPがMPIより簡単ということはない– データ依存性のない計算であれば，機械的にOpenMP指示文を入れれば良い– NUMAになるとより複雑：First Touch Data Placement

4Flat MPI vs. Hybrid
Flat-MPI：Each Core -> Independent

core
core

core
core

core
memorycore

core
memorymemory

core

core

core
core
core

core
core
core
core

memory

core
core
core
core

memorymemoryHybrid：Hierarchal Structure
core
core
core
core

OMP-15

共有メモリ型計算機
MEMORY

C
P
U

C
P
U

C
P
U

C
P
U

C
P
U

C
P
U

C
P
U

C
P
U

• SMP
– Symmetric Multi Processors– 複数のCPU（コア）で同じメモリ空間を共有するアーキテクチュアOMP-1

6OpenMPとは（1/2）
http://www.openmp.org• 共有メモリ型並列計算機用のDirectiveの統一規格– MPIやHPFに比べると遅く1996年頃から活動開始– 現在 Ver.4.X• 背景– CrayとSGIの合併（1996）– ASCI計画の開始（1995）• Accelerated Strategic Computing Initiative (ASCI) -> Advanced
Simulation and Computing Program (ASC)• ASCI：核実験のシミュレーションによる代替– 計算機開発，シミュレーションソフトウェア• SMPクラスタにフォーカス– ACI Red (Intel)，Blue Pacific/White/Purple/BlueGene (IBM)，Blue Mountain（SGI）• SMPクラスタ向けの並列プログラミングの共通API（Application Program
Interface）が必要

OMP-1

7OpenMPとは（2/2）
http://www.openmp.org• 主な計算機ベンダーが集まって OpenMP ARBを結成し，1997年にはもう規格案ができていたそうである– SC98ではすでにOpenMPのチュートリアルがあったし，すでにSGI Origin2000でOpenMP-MPIハイブリッドのシミュレーショ
ンをやっている例もあった。

• OpenMPはFortan版とC/C++版の規格が全く別々に進められてきた。
– Ver.2.5で言語間の仕様を統一• Ver.4.0ではGPU，Intel-MIC等Co-Processor，Accelerator環境での動作も考慮– OpenACCに近づいているOMP-1

8OpenMPの概要• 基本的仕様– プログラムを並列に実行するための動作をユーザーが明示– OpenMP実行環境は，依存関係，衝突，デッドロック，競合条
件，結果としてプログラムが誤った実行につながるような問題に関するチェックは要求されていない。
– プログラムが正しく実行されるよう構成するのはユーザーの責任である。

• 実行モデル– fork-join型並列モデル• 当初はマスタスレッドと呼ばれる単一プログラムとして実行を開始し，「PARALLEL」，「END PARALLEL」ディレクティヴの対で並列構造を構成する。並列構造が現れるとマスタスレッドはスレッドのチームを生成し，そのチームのマスタとなる。

– いわゆる「入れ子構造」も可能であるが，ここでは扱わない

OMP-19

Fork-Join 型並列モデル
MasterMasterthreadthreadthreadthreadthreadthreadMaster

PARALLEL
fork

MasterMasterthreadthreadthreadthreadthreadthreadthreadthreadEND PARALLEL
join

PARALLEL
fork

END PARALLEL
join

OMP-110

スレッド数• 環境変数 OMP_NUM_THREADS– 値の変え方export OMP_NUM_THREADS=8
setenv OMP_NUM_THREADS 8• bash（.bashrc）• csh(.cshrc)• たとえば，OMP_NUM_THREADS=4とすると，以下のように
i=1~100のループが4分割され，同時に実行される。
do i=

1, 25

do i= 26, 50
do i=

1,100
do i= 51, 75
do i= 76, 100

OMP-1

11

OpenMPに関連する情報• OpenMP Architecture Review Board (ARB)– http://www.openmp.org• 参考文献– Chandra, R. et al.「Parallel Programming in OpenMP」（Morgan Kaufmann）– Quinn, M.J. 「Parallel Programming in C with MPI and
OpenMP」（McGrawHill）– Mattson, T.G. et al. 「Patterns for Parallel Programming」（Addison Wesley）– 牛島「OpenMPによる並列プログラミングと数値計算法」（丸善）– Chapman, B. et al. 「Using OpenMP」（MIT Press）最新!

• 富士通他による翻訳：（OpenMP 3.0）必携 !
– http://www.openmp.org/mp-documents/OpenMP30spec-ja.pdf

OMP-1

12OpenMPの特徴• ディレクティヴ（指示行）の形で利用– 挿入直後のループが並列化される– コンパイラがサポートしていなければ，コメントとみなされるOMP-1

13OpenMP/Directives
Array Operations
Simple Substitution!$omp parallel dodo i= 1, NP
W(i,1)= 0.d0
W(i,2)= 0.d0
enddo!$omp end parallel do

DAXPY!$omp parallel dodo i= 1, NP
Y(i)= ALPHA*X(i) + Y(i)enddo!$omp end parallel do

Dot Products!$omp parallel do private(i)!$omp&
reduction(+:RHO)
do i= iS, iE
RHO= RHO + W(i,R)*W(i,Z)
enddo!$omp end parallel doOMP-1

14OpenMP/Direceives
Matrix/Vector Products!$omp parallel do private(i,j)
do i= 1, N
W(i,Q)= D(i)*W(i,P)
do j= 1, INL(i)W(i,Q)= W(i,Q) + W(IAL(j,i),P)
enddo
do j= 1, INU(i)W(i,Q)= W(i,Q) + W(IAU(j,i),P)
enddo
enddo
!$omp end parallel doOMP-1

15OpenMPの特徴• ディレクティヴ（指示行）の形で利用– 挿入直後のループが並列化される– コンパイラがサポートしていなければ，コメントとみなされる• 何も指定しなければ，何もしない– 「自動並列化」，「自動ベクトル化」とは異なる。
– 下手なことをするとおかしな結果になる：ベクトル化と同じ– データ分散等（Ordering）は利用者の責任• 共有メモリユニット内のプロセッサ数に応じて，「Thread」が立ち上がる– 「Thread」：MPIでいう「プロセス」に相当する。
– 普通は「Thread数＝共有メモリユニット内プロセッサ数，コア数」であるが最近のアーキテクチャではHyper Threading（HT）がサポートされているものが多い（1コアで2-4スレッド）OMP-116メモリ競合（Memory Contention）
MEMORY

C
P
U

C
P
U

C
P
U

C
P
U

C
P
U

C
P
U

C
P
U

C
P
U

• 複雑な処理をしている場合，複数のスレッドがメモリ上の同じアドレスにあるデータを同時に更新する可能性がある。
– 複数のCPUが配列の同じ成分を更新しようとする。
– メモリを複数のコアで共有しているためこのようなことが起こりうる。
– 場合によっては答えが変わるOMP-117メモリ競合（Memory Contention）（続き）
MEMORY

C
P
U

C
P
U

C
P
U

C
P
U

C
P
U

C
P
U

C
P
U

C
P
U

• 本演習で扱っている例は，そのようなことが生じないよう，
各スレッドが同時に同じ成分を更新するようなことはな
いようにする。
– これはユーザーの責任でやること，である。

• データ依存性（Data Dependency）• 多くのコア数（スレッド数）が増えるほど，メモリへの負担が増えて，処理速度は低下する（メモリ飽和）。

OMP-1

18

OpenMPの特徴（続き）• 基本は「!omp parallel for」～「!omp end parallel do」• 変数について，グローバル/sharedな変数と，Thread内
でローカルな「private」な変数に分けられる。
– デフォルトは「global/shared」– 内積を求める場合は「reduction」を使う
VAL= 0.d0!$OMP PARALLEL DO PRIVATE(ip,i) REDUCTION(+:VAL)
do ip= 1, PEsmpTOT
do i= index(ip-1)+1, index(ip)VAL= VAL + W(i,R) * W(i,Z)
enddo
enddo
!$OMP END PARALLEL DO

W(:,:)，R，Z，PEsmpTOTなどはグローバル変数

OMP-1

19

FORTRANとC
use omp_lib...
!$omp parallel do shared(n,x,y) private(i)do i= 1, nx(i)= x(i) + y(i)enddo!$ omp end parallel do#include <omp.h>...
{#pragma omp parallel for default(none) shared(n,x,y) private(i)for (i=0; i<n; i++)x[i] += y[i];}OMP-120

本講義における方針• OpenMPは多様な機能を持っているが，それらの全てを逐一教えることはしない。
– 講演者も全てを把握，理解しているわけではない。

• 数値解析に必要な最低限の機能のみ学習する。
– 具体的には，講義で扱っているICCG法によるポアソン方程式
ソルバーを動かすために必要な機能のみについて学習する– それ以外の機能については，自習，質問のこと（全てに答えられるとは限らない）。

OMP-1

21

最初にやること• use omp_lib• #include <omp.h>

FORTRANC• 様々な環境変数，インタフェースの定義（OpenMP3.0
以降でサポート）OMP-1

22

OpenMPディレクィヴ（FORTRAN）
sentinel directive_name [clause[[,] clause]…]• 大文字小文字は区別されない。
• sentinel– 接頭辞– FORTRANでは「!$OMP」，「C$OMP」，「*$OMP」，但し自由
ソース形式では「!$OMP」のみ。
– 継続行にはFORTRANと同じルールが適用される。以下はいずれも「!$OMP PARALLEL DO SHARED(A,B,C)」!$OMP PARALLEL DO!$OMP+SHARED (A,B,C)!$OMP PARALLEL DO &!$OMP SHARED (A,B,C)

OMP-1

23

OpenMPディレクィヴ（C）#pragma omp directive_name [clause[[,] clause]…]• 継続行は「＼」• 小文字を使用（変数名以外）#pragma omp parallel for shared (a,b,c)

OMP-1

24

PARALLEL DO!$OMP PARALLEL DO[clause[[,] clause] … ](do_loop)!$OMP END PARALLEL DO#pragma omp parallel for [clause[[,] clause] … ](for_loop)• 多重スレッドによって実行される領域を定義し，DOルー
プの並列化を実施する。
• 並び項目（clause）：よく利用するもの– PRIVATE（list）– SHARED（list）– DEFAULT（PRIVATE|SHARED|NONE）– REDUCTION（{operation|intrinsic}: list）

OMP-1

25

REDUCTION
REDUCTION ({operator|instinsic}: list)
reduction ({operator|instinsic}: list)• 「MPI_REDUCE」のようなものと思えばよい• Operator– ＋，*，-，.AND.，.OR.，.EQV.，.NEQV.

• Intrinsic– MAX，MIN，IAND，IOR，IEQROMP-126

実例A1：簡単なループ!$OMP PARALLEL DO
do i= 1, N
B(i)= (A(i) + B(i)) * 0.50
enddo!$OMP END PARALLEL DO• ループの繰り返し変数（ここでは「i」）はデフォルトでprivateなので，明示的に宣言は不要。
• 「END PARALLEL DO」は省略可能。
– C言語ではそもそも存在しないOMP-127

実例A2：REDUCTION!$OMP PARALLEL DO DEFAULT(PRIVATE) REDUCTION(+:A,B)
do i= 1, N
call WORK (Alocal, Blocal)
A= A + Alocal
B= B + Blocal
enddo!$OMP END PARALLEL DO• 「END PARALLEL DO」は省略可能。

28

OpenMP使用時に呼び出すことのできる
関数群
関数名

内容

int omp_get_num_threads (void)
int omp_get_thread_num (void)
double omp_get_wtime (void)

スレッド総数void omp_set_num_threads (int
num_threads)
call omp_set_num_threads (num_threads)

自スレッドのID
MPI_Wtimeと同じ
スレッド数設定

OMP-1

29

OpenMPを適用するには ?（内積）VAL= 0.d0
do i= 1, N
VAL= VAL + W(i,R) * W(i,Z)
enddoOMP-130

OpenMPを適用するには ?（内積）VAL= 0.d0
do i= 1, N
VAL= VAL + W(i,R) * W(i,Z)
enddo

VAL= 0.d0!$OMP PARALLEL DO PRIVATE(i) REDUCTION(+:VAL)
do i= 1, N
VAL= VAL + W(i,R) * W(i,Z)
enddo!$OMP END PARALLEL DO

Thread #0 W(i,R)*W(i,Z)
Thread #1 W(i,R)*W(i,Z)

・・・

Thread #2 W(i,R)*W(i,Z)

Thread #M W(i,R)*W(i,Z)

+
+

+

VAL

OpenMPディレクティヴの挿入
これでも並列計算は可能

OMP-1

31

OpenMPを適用するには ?（内積）VAL= 0.d0
do i= 1, N
VAL= VAL + W(i,R) * W(i,Z)
enddo

VAL= 0.d0!$OMP PARALLEL DO PRIVATE(i) REDUCTION(+:VAL)
do i= 1, N
VAL= VAL + W(i,R) * W(i,Z)
enddo!$OMP END PARALLEL DO

VAL= 0.d0!$OMP PARALLEL DO PRIVATE(ip,i) REDUCTION(+:VAL)
do ip= 1, PEsmpTOT
do i= index(ip-1)+1, index(ip)VAL= VAL + W(i,R) * W(i,Z)
enddo
enddo
!$OMP END PARALLEL DO

OpenMPディレクティヴの挿入
これでも並列計算は可能

多重ループの導入
PEsmpTOT：スレッド数
あらかじめ「INDEX(:)」を用意しておくより確実に並列計算実施（別に効率がよくなるわけでは無い）OMP-1

32

OpenMPを適用するには ?（内積）VAL= 0.d0
do i= 1, N
VAL= VAL + W(i,R) * W(i,Z)
enddo

VAL= 0.d0!$OMP PARALLEL DO PRIVATE(i) REDUCTION(+:VAL)
do i= 1, N
VAL= VAL + W(i,R) * W(i,Z)
enddo!$OMP END PARALLEL DO

VAL= 0.d0!$OMP PARALLEL DO PRIVATE(ip,i) REDUCTION(+:VAL)
do ip= 1, PEsmpTOT
do i= index(ip-1)+1, index(ip)VAL= VAL + W(i,R) * W(i,Z)
enddo
enddo
!$OMP END PARALLEL DO

OpenMPディレクティヴの挿入
これでも並列計算は可能

多重ループの導入
PEsmpTOT：スレッド数
あらかじめ「INDEX(:)」を用意しておくより確実に並列計算実施
PEsmpTOT個のスレッドが立ち上がり，
並列に実行

OMP-1

33

OpenMPを適用するには ?（内積）VAL= 0.d0!$OMP PARALLEL DO PRIVATE(ip,i) REDUCTION(+:VAL)
do ip= 1, PEsmpTOT
do i= index(ip-1)+1, index(ip)VAL= VAL + W(i,R) * W(i,Z)
enddo
enddo
!$OMP END PARALLEL DO

多重ループの導入
PEsmpTOT：スレッド数
あらかじめ「INDEX(:)」を用意しておくより確実に並列計算実施
PEsmpTOT個のスレッドが立ち上がり，並列に実行

各要素が計算されるスレッドを指定できる
例えば，N=100，PEsmpTOT=4とすると：
INDEX(0)= 0
INDEX(1)= 25
INDEX(2)= 50
INDEX(3)= 75
INDEX(4)= 100

34

Matrix-Vector Multiply
do i = 1, N
VAL= D(i)*W(i,P)
do k= indexL(i-1)+1, indexL(i)VAL= VAL + AL(k)*W(itemL(k),P)
enddo
do k= indexU(i-1)+1, indexU(i)VAL= VAL + AU(k)*W(itemU(k),P)
enddo
W(i,Q)= VAL
enddo

35

Matrix-Vector Multiply!$omp parallel do private(ip,i,VAL,k)do ip= 1, PEsmpTOT
do i = INDEX(ip-1)+1, INDEX(ip)
VAL= D(i)*W(i,P)
do k= indexL(i-1)+1, indexL(i)VAL= VAL + AL(k)*W(itemL(k),P)
enddo
do k= indexU(i-1)+1, indexU(i)VAL= VAL + AU(k)*W(itemU(k),P)
enddo
W(i,Q)= VAL
enddo
enddo
!$omp end parallel do

36

Matrix-Vector Multiply: Other ApproachThis is rather better for GPU and (very) many-corearchitectures: simpler structure of loops!$omp parallel do private(i,VAL,k)do i = 1, N
VAL= D(i)*W(i,P)
do k= indexL(i-1)+1, indexL(i)VAL= VAL + AL(k)*W(itemL(k),P)
enddo
do k= indexU(i-1)+1, indexU(i)VAL= VAL + AU(k)*W(itemU(k),P)
enddo
W(i,Q)= VAL
enddo!$omp end parallel do37

omp parallel (do)• omp parallel-omp end
parallelはそのたびにスレッドを生成，消滅させる：fork-join• ループが連続するとオーバーヘッドになる。
• omp parallel + omp
do/omp for
MasterMasterthreadthreadthreadthreadthreadMaster

PARALLEL
fork

threadMasterMasterthreadthreadthreadthreadthreadthreadthreadthreadEND PARALLEL
join

PARALLEL
fork

END PARALLEL
join#pragma omp parallel ...
#pragma omp for {...
#pragma omp for {!$omp parallel ...
!$omp dodo i= 1, N...
!$omp dodo i= 1, N...
!$omp end parallelrequired38• OpenMP• Login to OBCX• Parallel Version of the Code by OpenMP• STREAM• Data Dependency

39• OpenMP• Login to OBCX• Parallel Version of the Code by OpenMP• STREAM• Data Dependency

40

ここでの目標• solve_PCG（対角スケーリング，点ヤコビ前処理付きCG法）の並列化• “solver_PCG.f/c” (solve_PCG)• OpenMP指示行を入れるだけ（Index使わない）でやってみるOMP-141

前処理付共役勾配法
Preconditioned Conjugate Gradient Method （PCG）
Compute r(0)= b-[A]x(0)for i= 1, 2, …
solve [M]z(i-1)= r(i-1)ρi-1= r(i-1) z(i-1)
if i=1p(1)= z(0)else
βi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i-1)
endifq(i)= [A]p(i)αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip(i)r(i)= r(i-1) - αiq(i)check convergence |r|end

実際にやるべき計算は：{z} = [M ]−1{r}「近似逆行列」の計算が必要：[M ] ≈ [A] , [M ] ≈ [A]−1−1

究極の前処理：本当の逆行列[M ]−1 = [A]−1 , [M ] = [A]対角スケーリング：簡単＝弱い[M ] = [D] , [M ] = [D]−1−1

OMP-142

対角スケーリング，点ヤコビ前処理• 前処理行列として，もとの行列の対角成分のみを取り出した行列を前処理行列 [M] とする。
– 対角スケーリング，点ヤコビ（point-Jacobi）前処理
 D1
0

[M ] =  ...

0
 0

0

...

D2

0
0

...
0
0

DN −1
...

0

0 
0 
... 

0 
DN 

• solve [M]z(i-1)= r(i-1)という場合に逆行列を簡単に求めることができる。
• 簡単な問題では収束する。

43

Original: solve_PCG (1/3)
do i= 1, N
X(i) = 0.d0
W(i,2)= 0.0D0
W(i,3)= 0.0D0W(i,DD)= 1.d0/D(i)
enddo
...
ITR= N

対角成分の逆数（前処理用）
その都度，除算をすると効率が悪いため，予め配列に格納。嘗ては除算と加減乗算
は10:1と言われていたが最近はそれほどでもない。

do L= 1, ITR!C!C +----------------+!C | {z}= [Minv]{r} |!C +----------------+!C===
do i= 1, N
W(i,Z)= W(i,R)*W(i,DD)
enddo
!C===

!C
!C +-------------+!C | RHO= {r}{z} |!C +-------------+!C===
RHO= 0.d0
do i= 1, N
RHO= RHO + W(i,R)*W(i,Z)
enddo
!C===

Compute r(0)= b-[A]x(0)for i= 1, 2, …
solve [M]z(i-1)= r(i-1)ρi-1= r(i-1) z(i-1)
if i=1p(1)= z(0)else
βi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i-1)
endifq(i)= [A]p(i)αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip(i)r(i)= r(i-1) - αiq(i)check convergence |r|
end

44

Original: solve_PCG (2/3)!C!C +-----------------------------+!C | {p} = {z} if
ITER=1|!C | BETA= RHO / RHO1 otherwise |!C +-----------------------------+!C===
if ( L.eq.1 ) thendo i= 1, N
W(i,P)= W(i,Z)
enddo
else
BETA= RHO / RHO1
do i= 1, N
W(i,P)= W(i,Z) + BETA*W(i,P)
enddo
endif
!C===
!C
!C +-------------+!C | {q}= [A]{p} |!C +-------------+!C===
do i= 1, N
VAL= D(i)*W(i,P)
do k= indexL(i-1)+1, indexL(i)VAL= VAL + AL(k)*W(itemL(k),P)
enddo
do k= indexU(i-1)+1, indexU(i)VAL= VAL + AU(k)*W(itemU(k),P)
enddo
W(i,Q)= VAL
enddo
!C===

Compute r(0)= b-[A]x(0)for i= 1, 2, …
solve [M]z(i-1)= r(i-1)ρi-1= r(i-1) z(i-1)
if i=1p(1)= z(0)else
βi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i-1)
endifq(i)= [A]p(i)αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip(i)r(i)= r(i-1) - αiq(i)check convergence |r|
end

45

Original: solve_PCG (3/3)!C!C +---------------------+!C | ALPHA= RHO / {p}{q} |!C +---------------------+!C===
C1= 0.d0
do i= 1, N
C1= C1 + W(i,P)*W(i,Q)
enddo
ALPHA= RHO / C1
!C===
!C +----------------------+!C | {x}= {x} + ALPHA*{p} |!C | {r}= {r} - ALPHA*{q} |!C +----------------------+!C===
do i= 1, N
X(i) = X(i) + ALPHA * W(i,P)
W(i,R)= W(i,R) - ALPHA * W(i,Q)
enddo
DNRM2= 0.d0
do i= 1, N
DNRM2= DNRM2 + W(i,R)**2
enddo
!C===
ERR = dsqrt(DNRM2/BNRM2)
if (ERR .lt. EPS) then
IER = 0r= b-[A]x
goto 900
else
DNRM2=|r|2
RHO1 = RHO
BNRM2=|b|2
endif
enddo
IER = 1

ERR= |r|/|b|Compute r(0)= b-[A]x(0)for i= 1, 2, …
solve [M]z(i-1)= r(i-1)ρi-1= r(i-1) z(i-1)
if i=1p(1)= z(0)else
βi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i-1)
endifq(i)= [A]p(i)αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip(i)r(i)= r(i-1) - αiq(i)check convergence |r|
end

46

solve_PCG (1/5)
parallel computing by OpenMP
module solver_PCG
contains
subroutine solve_PCG&( N, NPL, NPU, indexL, itemL, indexU, itemU, D, B, X,&
AL, AU, EPS, ITR, IER, N2)
use omp_lib
implicit REAL*8 (A-H,O-Z)
integer :: N, NL, NU, N2
real(kind=8), dimension(N):: D, B, X

real(kind=8), dimension(NPL) :: ALreal(kind=8), dimension(NPU) :: AU
integer, dimension(0:N):: indexL, indexU
integer, dimension(NPL):: itemL
integer, dimension(NPU):: itemU
real(kind=8), dimension(:,:), allocatable :: W
integer, parameter :: R= 1
integer, parameter :: Z= 2
integer, parameter :: Q= 2
integer, parameter :: P= 3
integer, parameter :: DD= 4&&

solve_PCG (2/5)!$omp parallel do private(i)do i= 1, N
X(i) = 0.d0
W(i,2)= 0.0D0
W(i,3)= 0.0D0W(i,DD)= 1.d0/D(i)enddo!$omp parallel do private(i,VAL,k)do i= 1, N
VAL= D(i)*X(i)do k= indexL(i-1)+1, indexL(i)VAL= VAL + AL(k)*X(itemL(k))
enddo
do k= indexU(i-1)+1, indexU(i)VAL= VAL + AU(k)*X(itemU(k))
enddo
W(i,R)= B(i) - VAL
enddo
BNRM2= 0.0D0!$omp parallel do private(i) reduction(+:BNRM2)
do i= 1, N
BNRM2 = BNRM2 + B(i) **2
enddo

47

Compute r(0)= b-[A]x(0)for i= 1, 2, …
solve [M]z(i-1)= r(i-1)ρi-1= r(i-1) z(i-1)
if i=1p(1)= z(0)else
βi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i-1)
endifq(i)= [A]p(i)αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip(i)r(i)= r(i-1) - αiq(i)check convergence |r|endsolve_PCG (3/5)
ITR= N
Stime= omp_get_wtime()
do L= 1, ITR!$omp parallel do private(i)do i= 1, N
W(i,Z)= W(i,R)*W(i,DD)
enddo
RHO= 0.d0!$omp parallel do private(i) reduction(+:RHO)
do i= 1, N
RHO= RHO + W(i,R)*W(i,Z)
enddo
if ( L.eq.1 ) then!$omp parallel do private(i)do i= 1, N
W(i,P)= W(i,Z)
enddo
else
BETA= RHO / RHO1!$omp parallel do private(i)do i= 1, N
W(i,P)= W(i,Z) + BETA*W(i,P)
enddo
endif

48

Compute r(0)= b-[A]x(0)for i= 1, 2, …
solve [M]z(i-1)= r(i-1)ρi-1= r(i-1) z(i-1)
if i=1p(1)= z(0)else
βi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i-1)
endifq(i)= [A]p(i)αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip(i)r(i)= r(i-1) - αiq(i)check convergence |r|endsolve_PCG (4/5)!$omp parallel do private(i,VAL,k)do i= 1, N
VAL= D(i)*W(i,P)
do k= indexL(i-1)+1, indexL(i)VAL= VAL + AL(k)*W(itemL(k),P)
enddo
do k= indexU(i-1)+1, indexU(i)VAL= VAL + AU(k)*W(itemU(k),P)
enddo
W(i,Q)= VAL
enddo
C1= 0.d0!$omp parallel do private(i) reduction(+:C1)
do i= 1, N
C1= C1 + W(i,P)*W(i,Q)
enddo
ALPHA= RHO / C1!$omp parallel do private(i)do i= 1, N
X(i) = X(i)+ ALPHA * W(i,P)
W(i,R)= W(i,R) - ALPHA * W(i,Q)
enddo
DNRM2= 0.d0!$omp parallel do private(i) reduction(+:DNRM2)
do i= 1, N
DNRM2= DNRM2 + W(i,R)**2
enddo
ERR = dsqrt(DNRM2/BNRM2)...

49

Compute r(0)= b-[A]x(0)for i= 1, 2, …
solve [M]z(i-1)= r(i-1)ρi-1= r(i-1) z(i-1)
if i=1p(1)= z(0)else
βi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i-1)
endifq(i)= [A]p(i)αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip(i)r(i)= r(i-1) - αiq(i)check convergence |r|endsolve_PCG (5/5)
Stime = omp_get_wtime()
do L= 1, ITR...
if (ERR .lt. EPS) then
IER = 0goto 900
else
RHO1 = RHO
endif

Elapsed Time= Etime - Stime

enddo
IER = 1900 continue
Etime= omp_get_wtime()
write (*,'(i5,2(1pe16.6))') L, ERR
write (*,'(1pe16.6, a)') Etime-Stime, ' sec. (solver)'
ITR= L
deallocate (W)returnend

50

OMP-151

ファイルコピー：OBCX>$ cd /work/gt00/t00XYZ>$ cp /work/gt00/z30088/omp/omp-f.tar .
>$ tar xvf omp-f.tar>$ cd multicore
以下のディレクトリが出来ていることを確認
omp stream>$ cd omp/src20>$ make>$ cd ../run<modify “INPUT.DAT”><modify “go1.sh”, “go2.sh”>>$ pjsub go1.sh>$ pjsub go2.sh52<$O-omp>/src20/Makefile
parallel computing by OpenMP
F90= ifort
F90OPTFLAGS= -align array64byte -O3 -axCORE-AVX512 -qopenmp -ipo
F90FLAGS =$(F90OPTFLAGS).SUFFIXES:.SUFFIXES: .o .f .f90 .c#.f90.o:; $(F90) -c $(F90FLAGS) $(F90OPTFLAG) $<.f.o:; $(F90) -c $(F90FLAGS) $(F90OPTFLAG) $<#OBJS = ¥solver_PCG.o rcm.o struct.o pcg.o ¥boundary_cell.o cell_metrics.o ¥input.o main.o poi_gen.o pointer_init.o outucd.o
TARGET = ../run/sol20
all: $(TARGET)$(TARGET): $(OBJS)$(F90) $(F90FLAGS) -o $(TARGET) ¥$(OBJS) ¥$(F90FLAGS)
clean:
rm -f *.o $(TARGET) *.mod *~ PI*

53

ジョブ実行
• 実行方法– 基本的にバッチジョブのみ– インタラクティヴの実行は「基本的に」できません• 実行手順– ジョブスクリプトを書きます– ジョブを投入します– ジョブの状態を確認します– 結果を確認します• その他– 実行時には1ノード（28x2=56コア）が占有されます– 他のユーザーのジョブに使われることはありません54

Oakbridge-CX ノードのブロック図
1ノード：2CPU（ソケット）
Memory
96 GB

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

2933 MHz×6ch
140.8 GB/sec

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #0: 0th-27th cores

UPI
UPI
UPI

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #1: 28th-55th cores

Ultra Path Interconnect
10.4 GT/sec ×3= 124.8 GB/sec

28コア
Socket #0
基本的に1ソケット（1CPU）のみ使う

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

Memory96 GB2933 MHz×6ch
140.8 GB/sec

28コア
Socket #1

ジョブスクリプト（1/2）go1.sh• /work/gt00/t00XXX/multicore/omp/run/go1.sh• スケジューラへの指令 ＋ シェルスクリプト#!/bin/sh#PJM -N “test1”#PJM -L rscgrp=tutorial#PJM -L node=1#PJM --omp thread=24#PJM -L elapse=00:15:00#PJM -g gt00
#PJM -j#PJM -e err#PJM -o test1.lst

ジョブ名称（省略可）
実行キュー名
ノード数（原則＝1）
スレッド数（1-56，原則1-28）
実行時間
C
グループ名（財布）
エラー出力ファイル
標準出力ファイル

export KMP_AFFINITY=granularity=fine,compact./sol20
プログラム実行
export KMP_AFFINITY=granularity=fine,compact
各スレッドがSocket#0の0番から始まる各コアに順番に割り当てられる55

ジョブスクリプト（1/2）go2.sh• /work/gt00/t00XXX/multicore/omp/run/go2.sh• スケジューラへの指令 ＋ シェルスクリプト#!/bin/sh#PJM -N “test2”#PJM -L rscgrp=tutorial#PJM -L node=1#PJM --omp thread=24#PJM -L elapse=00:15:00#PJM -g gt00
#PJM -j#PJM -e err#PJM -o test2.lst./sol20

ジョブ名称（省略可）
実行キュー名
ノード数（原則＝1）
スレッド数（1-56，原則1-28）
実行時間
グループ名（財布）
エラー出力ファイル
標準出力ファイル

プログラム実行各スレッドがSocket#0/#1の各コアにランダムに割り当てられる

56

57

Oakbridge-CX ノードのブロック図
1ノード：2CPU（ソケット）
Memory
96 GB

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

2933 MHz×6ch
140.8 GB/sec

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #0: 0th-27th cores

UPI
UPI
UPI

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #1: 28th-55th cores

Ultra Path Interconnect
10.4 GT/sec ×3= 124.8 GB/sec

28コア
Socket #0

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

Memory96 GB2933 MHz×6ch
140.8 GB/sec

28コア
Socket #1

go1.sh: ソケット#0のコアのみが使われる
export KMP_AFFINITY=granularity=fine,compact

go2.sh: ソケット#0と#1のコアがランダムに使われる。
go1.shよりも早い場合がある。

58

ジョブ投入
>$ cd /work/gt00/t00XYZ>$ cd multicore/omp/run>$ pjsub go1.sh>$ cat test1.lst
INPUT.DAT
128 128 128
1.00e-0 1.00e-00 1.00e-00
1.0e-08

NX NY NZ
DX/DY/DZEPSICCG59

利用可能なキュー• 以下の2種類のキューを利用可能• 最大8ノードを使える– lecture• 8ノード（448コア），15分，アカウント有効期間中利用可能• 全教育ユーザーで共有– tutorial• 8ノード（448コア），15分，講義・演習実施時間帯• lectureよりは多くのジョブを投入可能（混み具合による）60

様々なコマンド• ジョブ実行• ジョブ実行状況• ジョブ停止• ジョブキューの状況• ジョブキューの状況（詳細）• 実行ジョブ情報• ジョブ実行履歴• ジョブ実行制限

pjsub SCRIPT NAME
pjstatpjdel JOB ID
pjstat --rsc
pjstat --rsc –x
pjstat –a
pjstat –H
pjstat --limit

61[t00XYZ@obcx04 run]$ pjsub go1.sh[INFO] PJM 0000 pjsub Job 292019 submitted.
[t00XYZ@obcx04 run]$ pjsub go2.sh[INFO] PJM 0000 pjsub Job 292020 submitted.
[t00XYZ@obcx04 run]$ pjstat
Oakbridge-CX scheduled stop time: 2020/04/24(Fri) 09:00:00 (Remain:
JOB_ID
292019292020

JOB_NAME
test1
test2

STATUS PROJECTRUNNING gt00
QUEUED gt00

RSCGROUP
lecturelectureSTART_DATE
04/20 09:50:42<--/-- --:--:--[t00XYZ@obcx04 run]$ pjstat
Oakbridge-CX scheduled stop time: 2020/04/24(Fri) 09:00:00 (Remain:
JOB_ID
292019292020

JOB_NAME
test1
test2

STATUS PROJECTRUNNING gt00
RUNNING gt00

RSCGROUP
lecturelecture3days 23:09:15)
ELAPSE
00:00:02
00:00:00

TOKEN NODE
1
1

3days 23:09:12)

START_DATE
04/20 09:50:42<
04/20 09:50:46<

ELAPSE
00:00:06
00:00:02

TOKEN NODE
1
1

[t00XYZ@obcx04 run]$ pjdel 292020[INFO] PJM 0100 pjdel Job 292020 canceled.
[t00XYZ@obcx04 run]$ pjstat
Oakbridge-CX scheduled stop time: 2020/04/24(Fri) 09:00:00 (Remain:
JOB_ID
292019JOB_NAME
test1

STATUS PROJECTRUNNING gt00

RSCGROUP
lectureSTART_DATE
04/20 09:50:42<[t00XYZ@obcx04 run]$ pjstat
Oakbridge-CX scheduled stop time: 2020/04/24(Fri) 09:00:00 (Remain:
No unfinished job found.

3days 23:09:04)
ELAPSE
00:00:14

3days 23:07:14)

TOKEN NODE
1

62

[t00XYZ@obcx04 ~]$ pjstat --rsc
RSCGRPSTATUS
lecture[ENABLE,START]
tutorial[DISABLE,STOP][t00XYZ@obcx04 ~]$ pjstat --rsc -x
RSCGRPSTATUS
lecture[ENABLE,START]
tutorial[DISABLE,STOP]

NODE
32
64

MIN_NODE MAX_NODE MAX_ELAPSE REMAIN_ELAPSE MEM(GB) PROJECT
1
8
00:15:00
00:15:00
168 gt00
1
8
00:15:00--:--:-168 gt00

[t00XYZ@obcx04 ~]$ pjstat -a
Oakbridge-CX scheduled stop time: 2020/04/24(Fri) 09:00:00 (Remain:
JOB_ID284147284149284159289904289909(…)

JOB_NAME STATUS PROJECT RSCGROUP********** RUNNING ******** ********** RUNNING ******** ********** RUNNING ******** ********** RUNNING ******** small********** RUNNING ******** small

START_DATE
04/19 12:58:20
04/19 11:50:18
04/19 19:16:10
04/18 19:59:41
04/19 01:02:58[t00XYZ@obcx04 ~]$ pjstat -H
Oakbridge-CX scheduled stop time: 2020/04/24(Fri) 09:00:00 (Remain:
JOB_ID290914290913290915(…)

JOB_NAME
test
test
test

STATUS
END
END
END

PROJECT
gt00
gt00
gt00

RSCGROUP
lecturelecturelecture[t00XYZ@obcx04 ~]$ pjstat --limit
PROJECTACCEPT
RUN BULK_RUN
gt00
0/ 80
0/ 20
0/ 256NODE
0/ -3days 23:19:29)
ELAPSE--:--:---:--:---:--:-37:40:50
32:37:33

TOKEN NODE
2
2

3days 23:19:16)

START_DATE
04/18 12:46:24
04/18 12:46:06
04/18 12:49:26

ELAPSE
00:01:44
00:02:07
00:00:59

TOKEN NODE
1
1
1

63

PCG計算時間: Etime-Stime
NX=NY=NZ=128，go1.sh
実行時間：やや不安定：5回くらい測定して最速時間採用
100

Thread #sec

Speed-up

80

1

27.201

1.000

60

2

13.796

1.972

40

4

7.185

3.786

8

4.099

6.637

12

3.435

7.918

16

3.260

8.343

20

3.048

8.925

24

2.982

9.123

28

2.877

9.456

Parallel Performance (%)

go1.sh

20

0
1

2

4

8

12

16

20

24

28

Core #

Large
大Granularity
粒度
Problem Size/Thread

Small
小

64

go1.shOnly cores on a single socket used#!/bin/sh#PJM -N “test1”#PJM -L rscgrp=tutorial#PJM -L node=1#PJM --omp thread=24#PJM -L elapse=00:15:00#PJM -g gt00
#PJM -j#PJM -e err#PJM -o test1.lst

1,2,4,8,12,16,20,24,28

export KMP_AFFINITY=granularity=fine,compact./sol20
Socket#0./sol20
Core #0-#27./sol20
Intel® Xeon®
Intel® Xeon®
Platinum 8280
Platinum 8280./sol20./sol20
Memory
96 GB

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

2933 MHz×6ch
140.8 GB/sec

UPI(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #0: 0th-27th cores

UPI
UPI

(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #1: 28th-55th cores

Ultra Path Interconnect
10.4 GT/sec ×3= 124.8 GB/sec

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

Memory96 GB2933 MHz×6ch
140.8 GB/sec

65

go2.shcores are randomly selected from 2 sockets#!/bin/sh#PJM -N “test1”#PJM -L rscgrp=tutorial#PJM -L node=1#PJM --omp thread=24#PJM -L elapse=00:15:00#PJM -g gt00
#PJM -j#PJM -e err#PJM -o test1.lst./sol20./sol20./sol20./sol20./sol20

1,2,4,8,12,16,20,24,28

Socket#0
Core #0-#27
Memory
96 GB

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

2933 MHz×6ch
140.8 GB/sec

Socket#1
Core #28-#55

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #0: 0th-27th cores

UPI
UPI
UPI

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #1: 28th-55th cores

Ultra Path Interconnect
10.4 GT/sec ×3= 124.8 GB/sec

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

Memory96 GB2933 MHz×6ch
140.8 GB/sec

66

Results: Parallel Performance
NX=NY=NZ=128
Measurement: 5 times, best case“go2.sh” is generally betterbased on “go1.sh” with 1 thread120

go1.shParallel Performance (%)

100

go2.sh

80

60

40

20

0
1

2

4

8

12

Core #

16

20

24

28

■ go1.sh■ go2.sh67

Oakbridge-CX (OBCX)
1-node: 2-CPU’s/sockets
Memory
96 GB

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

2933 MHz×6ch
140.8 GB/sec

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #0: 0th-27th cores

UPI
UPI
UPI

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #1: 28th-55th cores

Ultra Path Interconnect
10.4 GT/sec ×3= 124.8 GB/sec

Socket #0

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

Memory96 GB2933 MHz×6ch
140.8 GB/sec

Socket #1• Oakbridfe-CX– 各ノードは：2ソケット（CPU）：Intel Cascade Lake (CLX)– 各ソケットは28コア（合計56コア）• 各ソケットの各コアは他のソケットのメモリにアクセス可能（遅い）: NUMA (Non-Uniform Memory Access)• ローカルメモリを利用することがより効率的– 本講習会では基本的に1ソケットを使用– go2.shはソケット当たりコア数減少・効率的⇒遠隔メモリアクセス可能性

68

go3.sh#!/bin/sh#PJM -N “test2”#PJM -L rscgrp=lecture5#PJM -L node=1#PJM --omp thread=24#PJM -L elapse=00:15:00#PJM -g gt55
#PJM -j#PJM -e err#PJM -o test3.lst

1,2,4,8,12,16,20,24,28
Socket#0
Core #0-#27
Memory96 GB./sol20

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

2933 MHz×6ch
140.8 GB/sec

Socket#1
Core #28-#55

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #0: 0th-27th cores

UPI
UPI
UPI

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #1: 28th-55th cores

Ultra Path Interconnect
10.4 GT/sec ×3= 124.8 GB/sec

export KMP_AFFINITY=granularity=fine,compact./sol20
export KMP_AFFINITY=granularity=fine,balanced./sol20
export KMP_AFFINITY=granularity=fine,scatter./sol20

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

Memory96 GB2933 MHz×6ch
140.8 GB/sec

69

go4.sh: “verbose” provides topology
mapping (core-thread)#!/bin/sh#PJM -N “test2”#PJM -L rscgrp=lecture5#PJM -L node=1#PJM --omp thread=24#PJM -L elapse=00:15:00#PJM -g gt55
#PJM -j#PJM -e err#PJM -o test3.lst

1,2,4,8,12,16,20,24,28
Socket#0
Core #0-#27
Memory
96 GB

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

2933 MHz×6ch
140.8 GB/sec

Socket#1
Core #28-#55

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #0: 0th-27th cores

UPI
UPI
UPI

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #1: 28th-55th cores

Ultra Path Interconnect
10.4 GT/sec ×3= 124.8 GB/sec

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

Memory96 GB2933 MHz×6ch
140.8 GB/sec

export KMP_AFFINITY=verbose./sol20
export KMP_AFFINITY=granularity=fine,compact,verbose./sol20
export KMP_AFFINITY=granularity=fine,balanced,verbose./sol20
export KMP_AFFINITY=granularity=fine,scatter,verbose./sol20

Results(none): 1283, 24 threads
2.044 sec.
OMP: Info #251: KMP_AFFINITY: pid 225751 tid 225751 thread 0 bound to OS proc set 0-55
OMP: Info #251: KMP_AFFINITY: pid 225751 tid 225753 thread 2 bound to OS proc set 0-55
OMP: Info #251: KMP_AFFINITY: pid 225751 tid 225752 thread 1 bound to OS proc set 0-55
OMP: Info #251: KMP_AFFINITY: pid 225751 tid 225754 thread 3 bound to OS proc set 0-55
OMP: Info #251: KMP_AFFINITY: pid 225751 tid 225755 thread 4 bound to OS proc set 0-55
OMP: Info #251: KMP_AFFINITY: pid 225751 tid 225756 thread 5 bound to OS proc set 0-55
OMP: Info #251: KMP_AFFINITY: pid 225751 tid 225757 thread 6 bound to OS proc set 0-55
OMP: Info #251: KMP_AFFINITY: pid 225751 tid 225758 thread 7 bound to OS proc set 0-55
OMP: Info #251: KMP_AFFINITY: pid 225751 tid 225759 thread 8 bound to OS proc set 0-55
OMP: Info #251: KMP_AFFINITY: pid 225751 tid 225760 thread 9 bound to OS proc set 0-55
OMP: Info #251: KMP_AFFINITY: pid 225751 tid 225761 thread 10 bound to OS proc set 0-55
OMP: Info #251: KMP_AFFINITY: pid 225751 tid 225762 thread 11 bound to OS proc set 0-55
OMP: Info #251: KMP_AFFINITY: pid 225751 tid 225763 thread 12 bound to OS proc set 0-55
OMP: Info #251: KMP_AFFINITY: pid 225751 tid 225764 thread 13 bound to OS proc set 0-55
OMP: Info #251: KMP_AFFINITY: pid 225751 tid 225765 thread 14 bound to OS proc set 0-55
OMP: Info #251: KMP_AFFINITY: pid 225751 tid 225766 thread 15 bound to OS proc set 0-55
OMP: Info #251: KMP_AFFINITY: pid 225751 tid 225767 thread 16 bound to OS proc set 0-55
OMP: Info #251: KMP_AFFINITY: pid 225751 tid 225768 thread 17 bound to OS proc set 0-55
OMP: Info #251: KMP_AFFINITY: pid 225751 tid 225769 thread 18 bound to OS proc set 0-55
OMP: Info #251: KMP_AFFINITY: pid 225751 tid 225770 thread 19 bound to OS proc set 0-55
Intel® Xeon®
Intel®
Xeon®
OMP: DDR4
Info #251:
KMP_AFFINITY:
pid225751
DDR4tid 225771 thread 20 bound to OS proc set 0-55
UPI
DDR4
DDR4
Platinum 8280
Platinum 8280
OMP: Socket#0
Info (Cascade#251:Lake,KMP_AFFINITY:
pid
225772 thread 21 bound to OS proc set 0-55
MemoryMemory
DDR4
DDR4tid
CLX)(Cascade
Socket#1
Lake, 225751
CLX)
UPI
96 GB
96 GB
DDR4
DDR4
2.7GHz, 28-Cores
2.7GHz, 28-Cores
OMP:
Info#0-#27#251:
KMP_AFFINITY:
pid225751
DDR4UPI
DDR4tid 225774 thread 23 bound to OS proc set 0-55
2.419 TFLOPS
2.419
TFLOPSCore#28-#55
Core
Soc. #0: 0 -27 cores
Soc. #1: 28 -55 cores
DDR4
DDR4
OMP: Info #251: KMP_AFFINITY:
pid 225751
tid 225773 thread 22 bound to OS proc set 0-55
Ultra Path Interconnectth2933 MHz×6ch
140.8 GB/secthth

10.4 GT/sec ×3= 124.8 GB/secth2933 MHz×6ch
140.8 GB/sec

Thread ID

Core ID70

Results(compact): 1283, 24 threads
2.978 sec., All threads on Soc.#0
OMP: Info #251: KMP_AFFINITY: pid 225775 tid 225775 thread 0 bound to OS proc set 0
OMP: Info #251: KMP_AFFINITY: pid 225775 tid 225776 thread 1 bound to OS proc set 1
OMP: Info #251: KMP_AFFINITY: pid 225775 tid 225777 thread 2 bound to OS proc set 2
OMP: Info #251: KMP_AFFINITY: pid 225775 tid 225778 thread 3 bound to OS proc set 3
OMP: Info #251: KMP_AFFINITY: pid 225775 tid 225780 thread 5 bound to OS proc set 5
OMP: Info #251: KMP_AFFINITY: pid 225775 tid 225779 thread 4 bound to OS proc set 4
OMP: Info #251: KMP_AFFINITY: pid 225775 tid 225781 thread 6 bound to OS proc set 6
OMP: Info #251: KMP_AFFINITY: pid 225775 tid 225782 thread 7 bound to OS proc set 7
OMP: Info #251: KMP_AFFINITY: pid 225775 tid 225783 thread 8 bound to OS proc set 8
OMP: Info #251: KMP_AFFINITY: pid 225775 tid 225784 thread 9 bound to OS proc set 9
OMP: Info #251: KMP_AFFINITY: pid 225775 tid 225785 thread 10 bound to OS proc set 10
OMP: Info #251: KMP_AFFINITY: pid 225775 tid 225786 thread 11 bound to OS proc set 11
OMP: Info #251: KMP_AFFINITY: pid 225775 tid 225787 thread 12 bound to OS proc set 12
OMP: Info #251: KMP_AFFINITY: pid 225775 tid 225788 thread 13 bound to OS proc set 13
OMP: Info #251: KMP_AFFINITY: pid 225775 tid 225789 thread 14 bound to OS proc set 14
OMP: Info #251: KMP_AFFINITY: pid 225775 tid 225790 thread 15 bound to OS proc set 15
OMP: Info #251: KMP_AFFINITY: pid 225775 tid 225791 thread 16 bound to OS proc set 16
OMP: Info #251: KMP_AFFINITY: pid 225775 tid 225792 thread 17 bound to OS proc set 17
OMP: Info #251: KMP_AFFINITY: pid 225775 tid 225793 thread 18 bound to OS proc set 18
OMP: Info #251: KMP_AFFINITY: pid 225775 tid 225795 thread 20 bound to OS proc set 20
Intel® Xeon®
Intel®
Xeon®
OMP: DDR4
Info #251:
KMP_AFFINITY:
pid
225775
DDR4tid 225794 thread 19 bound to OS proc set 19
UPI
DDR4
DDR4
Platinum 8280
Platinum 8280
OMP: Socket#0
Info (Cascade#251:Lake,KMP_AFFINITY:
pid225796 thread 21 bound to OS proc set 21
MemoryMemory
DDR4
DDR4tid
CLX)(Cascade
Socket#1
Lake, 225775
CLX)
UPI
96 GB
96 GB
DDR4
DDR4
2.7GHz, 28-Cores
2.7GHz, 28-Cores
OMP:
Info#0-#27#251:
KMP_AFFINITY:
pid
225775DDR4UPI
DDR4tid 225797 thread 22 bound to OS proc set 22
2.419 TFLOPS
2.419
TFLOPSCore#28-#55
Core
Soc. #0: 0 -27 cores
Soc. #1: 28 -55 cores
DDR4
DDR4
OMP: Info #251: KMP_AFFINITY:
pid 225775
tid 225798 thread 23 bound to OS proc set 23
Ultra Path Interconnectth2933 MHz×6ch
140.8 GB/secthth

10.4 GT/sec ×3= 124.8 GB/secth2933 MHz×6ch
140.8 GB/sec

Thread ID

Core ID

71

72

Results(balanced): 1283, 24 threads
2.007 sec., 0-11:Soc.#0, 12-23:Soc.#1
OMP: Info #251: KMP_AFFINITY: pid 225799 tid 225799 thread 0 bound to OS proc set 0
OMP: Info #251: KMP_AFFINITY: pid 225799 tid 225800 thread 1 bound to OS proc set 1
OMP: Info #251: KMP_AFFINITY: pid 225799 tid 225801 thread 2 bound to OS proc set 2
OMP: Info #251: KMP_AFFINITY: pid 225799 tid 225802 thread 3 bound to OS proc set 3
OMP: Info #251: KMP_AFFINITY: pid 225799 tid 225803 thread 4 bound to OS proc set 4
OMP: Info #251: KMP_AFFINITY: pid 225799 tid 225804 thread 5 bound to OS proc set 5
OMP: Info #251: KMP_AFFINITY: pid 225799 tid 225805 thread 6 bound to OS proc set 6
OMP: Info #251: KMP_AFFINITY: pid 225799 tid 225806 thread 7 bound to OS proc set 7
OMP: Info #251: KMP_AFFINITY: pid 225799 tid 225807 thread 8 bound to OS proc set 8
OMP: Info #251: KMP_AFFINITY: pid 225799 tid 225808 thread 9 bound to OS proc set 9
OMP: Info #251: KMP_AFFINITY: pid 225799 tid 225809 thread 10 bound to OS proc set 10
OMP: Info #251: KMP_AFFINITY: pid 225799 tid 225810 thread 11 bound to OS proc set 11
OMP: Info #251: KMP_AFFINITY: pid 225799 tid 225811 thread 12 bound to OS proc set 28
OMP: Info #251: KMP_AFFINITY: pid 225799 tid 225812 thread 13 bound to OS proc set 29
OMP: Info #251: KMP_AFFINITY: pid 225799 tid 225813 thread 14 bound to OS proc set 30
OMP: Info #251: KMP_AFFINITY: pid 225799 tid 225814 thread 15 bound to OS proc set 31
OMP: Info #251: KMP_AFFINITY: pid 225799 tid 225815 thread 16 bound to OS proc set 32
OMP: Info #251: KMP_AFFINITY: pid 225799 tid 225816 thread 17 bound to OS proc set 33
OMP: Info #251: KMP_AFFINITY: pid 225799 tid 225817 thread 18 bound to OS proc set 34
OMP: Info #251: KMP_AFFINITY: pid 225799 tid 225818 thread 19 bound to OS proc set 35
Intel® Xeon®
Intel®
Xeon®
OMP: DDR4
Info #251:
KMP_AFFINITY:
pid225799DDR4tid 225819 thread 20 bound to OS proc set 36
UPI
DDR4
DDR4
Platinum 8280
Platinum 8280
OMP: Socket#0
Info (Cascade#251:Lake,KMP_AFFINITY:
pid
225820 thread 21 bound to OS proc set 37
MemoryMemory
DDR4
DDR4tid
CLX)(Cascade
Socket#1
Lake, 225799
CLX)
UPI
96 GB
96 GB
DDR4
DDR4
2.7GHz, 28-Cores
2.7GHz, 28-Cores
OMP:
Info#0-#27#251:
KMP_AFFINITY:
pid225799DDR4UPI
DDR4tid 225821 thread 22 bound to OS proc set 38
2.419 TFLOPS
2.419
TFLOPSCore#28-#55
Core
Soc. #0: 0 -27 cores
Soc. #1: 28 -55 cores
DDR4
DDR4
OMP: Info #251: KMP_AFFINITY:
pid 225799
tid 225822 thread 23 bound to OS proc set 39
Ultra Path Interconnectth2933 MHz×6ch
140.8 GB/secthth

10.4 GT/sec ×3= 124.8 GB/secth2933 MHz×6ch
140.8 GB/sec

Thread ID

Core ID

Results(scatter): 1283, 24 threads
2.175 sec.
OMP: Info #251: KMP_AFFINITY: pid 225823 tid 225823 thread 0 bound to OS proc set 0
OMP: Info #251: KMP_AFFINITY: pid 225823 tid 225824 thread 1 bound to OS proc set 28
OMP: Info #251: KMP_AFFINITY: pid 225823 tid 225825 thread 2 bound to OS proc set 1
OMP: Info #251: KMP_AFFINITY: pid 225823 tid 225826 thread 3 bound to OS proc set 29
OMP: Info #251: KMP_AFFINITY: pid 225823 tid 225827 thread 4 bound to OS proc set 2
OMP: Info #251: KMP_AFFINITY: pid 225823 tid 225828 thread 5 bound to OS proc set 30
OMP: Info #251: KMP_AFFINITY: pid 225823 tid 225829 thread 6 bound to OS proc set 3
OMP: Info #251: KMP_AFFINITY: pid 225823 tid 225830 thread 7 bound to OS proc set 31
OMP: Info #251: KMP_AFFINITY: pid 225823 tid 225831 thread 8 bound to OS proc set 4
OMP: Info #251: KMP_AFFINITY: pid 225823 tid 225832 thread 9 bound to OS proc set 32
OMP: Info #251: KMP_AFFINITY: pid 225823 tid 225833 thread 10 bound to OS proc set 5
OMP: Info #251: KMP_AFFINITY: pid 225823 tid 225834 thread 11 bound to OS proc set 33
OMP: Info #251: KMP_AFFINITY: pid 225823 tid 225835 thread 12 bound to OS proc set 6
OMP: Info #251: KMP_AFFINITY: pid 225823 tid 225836 thread 13 bound to OS proc set 34
OMP: Info #251: KMP_AFFINITY: pid 225823 tid 225837 thread 14 bound to OS proc set 7
OMP: Info #251: KMP_AFFINITY: pid 225823 tid 225838 thread 15 bound to OS proc set 35
OMP: Info #251: KMP_AFFINITY: pid 225823 tid 225839 thread 16 bound to OS proc set 8
OMP: Info #251: KMP_AFFINITY: pid 225823 tid 225840 thread 17 bound to OS proc set 36
OMP: Info #251: KMP_AFFINITY: pid 225823 tid 225841 thread 18 bound to OS proc set 9
OMP: Info #251: KMP_AFFINITY: pid 225823 tid 225842 thread 19 bound to OS proc set 37
Intel® Xeon®
Intel®
Xeon®
OMP: DDR4
Info #251:
KMP_AFFINITY:
pid
225823
DDR4tid 225843 thread 20 bound to OS proc set 10
UPI
DDR4
DDR4
Platinum 8280
Platinum 8280
OMP: Socket#0
Info (Cascade#251:Lake,KMP_AFFINITY:
pid225844 thread 21 bound to OS proc set 38
MemoryMemory
DDR4
DDR4tid
CLX)(Cascade
Socket#1
Lake, 225823
CLX)
UPI
96 GB
96 GB
DDR4
DDR4
2.7GHz, 28-Cores
2.7GHz, 28-Cores
OMP:
Info#0-#27#251:
KMP_AFFINITY:
pid
225823DDR4UPI
DDR4tid 225845 thread 22 bound to OS proc set 112.419 TFLOPS
2.419
TFLOPSCore#28-#55
Core
Soc. #0: 0 -27 cores
Soc. #1: 28 -55 cores
DDR4
DDR4
OMP: Info #251: KMP_AFFINITY:
pid 225823
tid 225846 thread 23 bound to OS proc set 39
Ultra Path Interconnectth2933 MHz×6ch
140.8 GB/secthth

10.4 GT/sec ×3= 124.8 GB/secth2933 MHz×6ch
140.8 GB/sec

Thread ID

Core ID

73

74

Exercises• Effect of problem size (NX, NY, NZ)• Effect of Thread # (omp_thread: 1-28)

75• OpenMP• Login to OBCX• Parallel Version of the Code by OpenMP• STREAM• Data Dependency

OMP-376

何故28倍にならないか?
• 28スレッドがメモリにアクセスすると，1スレッドの場合と比較して，スレッド当り（コア当り）メモリ性能は低下– 飽和• 疎行列はmemory-boundなためその傾向がより顕著– 疎行列計算の高速化：研究途上の課題• 問題規模が比較的小さい• 何故go2.shが良いか？

77

Category

Capacity

X-Way
Set Associative

Cache
Line

L1$Data

32 KB/core

8-Way

64B

L1$Instruction

32 KB/core

8-Way

64B

L2

1.00 MB/core

16-Way64B

L338.5 MB/socket

11-Way64B

Memory
96 GB

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

2933 MHz×6ch
140.8 GB/sec

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #0: 0th-27th cores

UPI
UPI
UPI

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #1: 28th-55th cores

Ultra Path Interconnect
10.4 GT/sec ×3= 124.8 GB/sec

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

Memory96 GB2933 MHz×6ch
140.8 GB/sec

Intro

78

疎行列・密行列
do i= 1, N
Y(i)= D(i)*X(i)do k= index(i-1)+1, index(i)kk= item(k)Y(i)= Y(i) + AMAT(k)*X(kk)
enddo
enddo

do j= 1, N
Y(j)= 0.d0
do i= 1, N
Y(j)= Y(j) + A(i,j)*X(i)
enddo
enddo

• “X” in RHS– 密行列：連続アクセス，キャッシュ有効利用– 疎行列：連続性は保証されず，キャッシュを有効に活用できず• より「memory-bound」

OMP-379

GeoFEM Benchmark
ICCG法の性能（固体力学向け）
SR11K/J2

SR16K/M1

T2K

FX10

京

Core #/Node

16

32

16

16

8

Peak Performance(GFLOPS)

147.2

980.5

147.2

236.5

128.0

STREAM Triad (GB/s)

101.0

264.2

20.0

64.7

43.3

B/F

0.686

0.269

0.136

0.274

0.338

GeoFEM (GFLOPS)

19.0

72.7

4.69

16.0

11.0

% to Peak

12.9

7.41

3.18

6.77

8.59

LLC/core (MB)

18.0

4.00

2.00

0.75

0.75

疎行列ソルバー：Memory-Bound

80

STREAM benchmark
http://www.cs.virginia.edu/stream/• メモリバンド幅を測定するベンチマーク– Copy:– Scale:– Add:– Triad:c(i)= a(i)c(i)= s*b(i)c(i)= a(i) + b(i)c(i)= a(i) + s*b(i)---------------------------------------------Double precision appears to have 16 digits of accuracy
Assuming 8 bytes per DOUBLE PRECISION word---------------------------------------------Number of processors =16
Array size =2000000
Offset=
0
The total memory requirement is732.4 MB (45.8MB/task)
You are running each test 10 times-The *best* time for each test is used
*EXCLUDING* the first and last iterations------------------------------------------------------------------------------------------------------Function
Rate (MB/s) Avg time
Min time Max timeCopy:
18334.1898
0.02800.02790.0280Scale:
18035.1690
0.02840.02840.0285
Add:
18649.4455
0.04120.04120.0413
Triad:
19603.8455
0.03940.03920.0398

81

マイクロプロセッサの動向
CPU性能，メモリバンド幅のギャップ

http://www.cs.virginia.edu/stream/OMP-182

実行：MPIバージョン>$ cd /work/gt00/t00XYZ>$ cd multicore/stream>$ mpiifort -align array64byte -O3 -axCORE-AVX512 stream.f –o stream>$ pjsub XXX.shMemory
96 GB

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #0: 0th-27th cores

2933 MHz×6ch
140.8 GB/sec

Socket#0
Core #0-#27

UPI
UPI
UPI

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #1: 28th-55th cores

Ultra Path Interconnect
10.4 GT/sec ×3= 124.8 GB/sec

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

Memory96 GB2933 MHz×6ch
140.8 GB/sec

Socket#1
Core #28-#55

83

s01.sh: Use 1 core#!/bin/sh#PJM -N "test"#PJM -L rscgrp=tutorial#PJM -L node=1#PJM --mpi proc=1#PJM -L elapse=00:15:00#PJM -g gt00
#PJM -j#PJM -e err#PJM -o s01.lst
mpiexec.hydra -n ${PJM_MPI_PROC} ./stream

Cores are randomly
selected■ go2.shrandomCore are specified■ go1.shcompact

export I_MPI_PIN_PROCESSOR_LIST=0
mpiexec.hydra -n ${PJM_MPI_PROC} ./stream

Memory
96 GB

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

2933 MHz×6ch
140.8 GB/sec

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #0: 0th-27th cores

UPI
UPI
UPI

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #1: 28th-55th cores

Ultra Path Interconnect
10.4 GT/sec ×3= 124.8 GB/sec

Socket #0: 0th-27th Cores

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

Memory96 GB2933 MHz×6ch
140.8 GB/sec

Socket #1: 28th-55th Cores84s16.sh: Use 16 cores#!/bin/sh#PJM -N "test"#PJM -L rscgrp=tutorial#PJM -L node=1#PJM --mpi proc=16#PJM -L elapse=00:15:00#PJM -g gt00
#PJM -j#PJM -e err#PJM -o s16.lst
mpiexec.hydra -n ${PJM_MPI_PROC} ./stream

Cores are randomly
selected■ go2.shrandomCore are specified■ go1.shcompact

export I_MPI_PIN_PROCESSOR_LIST=0-15
mpiexec.hydra -n ${PJM_MPI_PROC} ./stream

Memory
96 GB

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

2933 MHz×6ch
140.8 GB/sec

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #0: 0th-27th cores

UPI
UPI
UPI

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #1: 28th-55th cores

Ultra Path Interconnect
10.4 GT/sec ×3= 124.8 GB/sec

Socket #0: 0th-27th Cores

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

Memory96 GB2933 MHz×6ch
140.8 GB/sec

Socket #1: 28th-55th Cores85s32.sh: Use 32 cores#!/bin/sh#PJM -N "test"#PJM -L rscgrp=tutorial#PJM -L node=1#PJM --mpi proc=32#PJM -L elapse=00:15:00#PJM -g gt00
#PJM -j#PJM -e err#PJM -o s32.lst
mpiexec.hydra -n ${PJM_MPI_PROC} ./stream

Cores are randomly
selected■ go2.shrandomCore are specified■ go1.shcompact

export I_MPI_PIN_PROCESSOR_LIST=0-15,28-43
mpiexec.hydra -n ${PJM_MPI_PROC} ./stream

Memory
96 GB

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

2933 MHz×6ch
140.8 GB/sec

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #0: 0th-27th cores

UPI
UPI
UPI

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #1: 28th-55th cores

Ultra Path Interconnect
10.4 GT/sec ×3= 124.8 GB/sec

Socket #0: 0th-27th Cores

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

Memory96 GB2933 MHz×6ch
140.8 GB/sec

Socket #1: 28th-55th Cores86

s48.sh: Use 48 cores#!/bin/sh#PJM -N "test"#PJM -L rscgrp=tutorial#PJM -L node=1#PJM --mpi proc=48#PJM -L elapse=00:15:00#PJM -g gt00
#PJM -j#PJM -e err#PJM -o s48.lst
mpiexec.hydra -n ${PJM_MPI_PROC} ./stream

Cores are randomly
selected■ go2.shrandomCore are specified■ go1.shcompact

export I_MPI_PIN_PROCESSOR_LIST=0-23,28-51
mpiexec.hydra -n ${PJM_MPI_PROC} ./stream

Memory
96 GB

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

2933 MHz×6ch
140.8 GB/sec

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #0: 0th-27th cores

UPI
UPI
UPI

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #1: 28th-55th cores

Ultra Path Interconnect
10.4 GT/sec ×3= 124.8 GB/sec

Socket #0: 0th-27th Cores

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

Memory96 GB2933 MHz×6ch
140.8 GB/sec

Socket #1: 28th-55th Cores87s56.sh: Use 56 cores#!/bin/sh#PJM -N "test"#PJM -L rscgrp=tutorial#PJM -L node=1#PJM --mpi proc=56#PJM -L elapse=00:15:00#PJM -g gt00
#PJM -j#PJM -e err#PJM -o s56.lst
mpiexec.hydra -n ${PJM_MPI_PROC} ./stream

Cores are randomly
selected■ go2.shrandomCore are specified■ go1.shcompact

export I_MPI_PIN_PROCESSOR_LIST=0-55
mpiexec.hydra -n ${PJM_MPI_PROC} ./stream

Memory
96 GB

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

2933 MHz×6ch
140.8 GB/sec

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #0: 0th-27th cores

UPI
UPI
UPI

Intel® Xeon®
Platinum 8280
(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #1: 28th-55th cores

Ultra Path Interconnect
10.4 GT/sec ×3= 124.8 GB/sec

Socket #0: 0th-27th Cores

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

Memory96 GB2933 MHz×6ch
140.8 GB/sec

Socket #1: 28th-55th Cores

88

Triad on a Single Node of OBCX
Peak is 281.57 GB/sec.
メモリ・キャッシュは「Random」の方がより効果的に利用されている（12-28コアの場合）
250○RadomRandom●Specified
Specified #0-#55#0-#55

GB/sec

200

150

100

50

0
1

10

Core #

100

89

Triad on a Single Node of OBCX
Peak is 281.57 GB/sec.
メモリ・キャッシュは「Random」の方がより効果的に利用されている（12-28コアの場合）
2-Sockets
Random250○RadomRandom●Specified
Specified #0-#55#0-#55

GB/sec

200

150

100

1-SocketSpecified

50

0
1

10

Core #

100

Memory
96 GB

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

2933 MHz×6ch
140.8 GB/sec

Intel® Xeon®
Platinum 8280

UPI

(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS

UPI
UPI

Soc. #0: 0th-27th cores

1

2(Cascade Lake, CLX)
2.7GHz, 28-Cores
2.419 TFLOPS
Soc. #1: 28th-55th cores

Ultra Path Interconnect
10.4 GT/sec ×3= 124.8 GB/sec

Socket #0: 0th-27th Cores

Socket #Intel® Xeon®
Platinum 8280

DDR4
DDR4
DDR4
DDR4
DDR4
DDR4

Memory96 GB2933 MHz×6ch
140.8 GB/sec

Socket #1: 28th-55th Cores

Triad on aSingle Node of
OBCX

90

Core #

RandomSpecified

1

1.000

2

1.998

4

3.912

6

5.792

8

7.615

7.177

12

11.0897.844

1612.2147.968

24

12.2787.945– 各ソケットに6枚のメモリを装着できる– 1ソケット6コア（6プロセス）まではほぼ比例28

15.9627.705 •

12-28 cores32

15.90115.86248

15.45215.49756

15.37015.358– Random：2ソケット利用– Specified/Compact：1ソケット

1コアに対する性能向上
1.000（Speed-Up）
1.963• ソケット当たりメモリチャン
3.809
ネル数=6
5.682

91

Triad on a Single Node of OBCX
Peak is 281.57 GB/sec.
●：メモリバンド幅は8-28コアでほぼ一定（飽和）32-56コアでは倍になる
250○RadomRandom●Specified
Specified #0-#55#0-#55

GB/sec

200

150

100

50

0
1

10

Core #

100

92

Triad on a Single Node of OBCX
Peak is 281.57 GB/sec.
メモリ・キャッシュは「Random」の方がより効果的に利用されている（12-28コアの場合）
20

Speed-Up

15

10

5

Radoml○ Random
Specified#0-#55#0-#55● Specified
ー Ideal
Ideal

0
0

10

20

30

Core #

40

50

60

93

Exercises• Running the code
• Try various number of processes (1-56)• OpenMP-version and Single PE version areavailable– Fortran，C– Web-site of STREAM– http://www.cs.virginia.edu/stream/

94• OpenMP• Login to Reedbush-U• Parallel Version of the Code by OpenMP• STREAM• Data Dependency

OMP-195

ICCG法の並列化• 内積：OK• DAXPY：OK• 行列ベクトル積：OK• 前処理

OMP-1

96

前処理はどうするか?
対角スケーリングなら簡単：でも遅い
do i= 1, N
W(i,Z)= W(i,R)*W(i,DD)
enddo!$omp parallel do private(i)do i = 1, N
W(i,Z)= W(i,R)*W(i,DD)
enddo!$omp end parallel do!$omp parallel do private(ip,i)do ip= 1, PEsmpTOT
do i = INDEX(ip-1)+1, INDEX(ip)
W(i,Z)= W(i,R)*W(i,DD)
enddo
enddo
!$omp end parallel do

64*64*64
METHOD= 1
1
6.543963E+00
101 1.748392E-05
146 9.731945E-09
real

0m14.662s

METHOD= 3
1
6.299987E+00
101 1.298539E+00
201 2.725948E-02
301 3.664216E-05
401 2.146428E-08
413 9.621688E-09
real

0m19.660s

OMP-1

97

前処理はどうするか?
不完全修正
コレスキー
分解

do i= 1, N
VAL= D(i)do k= indexL(i-1)+1, indexL(i)VAL= VAL - (AL(k)**2) * W(itemL(k),DD)
enddo
W(i,DD)= 1.d0/VAL
enddo

前進代入

do i= 1, N
WVAL= W(i,Z)
do k= indexL(i-1)+1, indexL(i)WVAL= WVAL - AL(k) * W(itemL(k),Z)
enddo
W(i,Z)= WVAL * W(i,DD)
enddo

OMP-1

データ依存性：メモリの読み込みと書き出しが同時に発生し，並列化困難

不完全修正
コレスキー
分解

do i= 1, N
VAL= D(i)do k= indexL(i-1)+1, indexL(i)VAL= VAL - (AL(k)**2) * W(itemL(k),DD)
enddo
W(i,DD)= 1.d0/VAL
enddo

前進代入

do i= 1, N
WVAL= W(i,Z)
do k= indexL(i-1)+1, indexL(i)WVAL= WVAL - AL(k) * W(itemL(k),Z)
enddo
W(i,Z)= WVAL * W(i,DD)
enddo

98

OMP-1

前進代入
4スレッドによる並列化を試みる

13 14 15 169

10 11 12

5

6

7

8

1

2

3

4

do i= 1, N
WVAL= W(i,Z)
do k= indexL(i-1)+1, indexL(i)WVAL= WVAL - AL(k) * W(itemL(k),Z)
enddo
W(i,Z)= WVAL * W(i,DD)
enddo

99

OMP-1

前進代入
4スレッドによる並列化を試みる

13 14 15 169

10 11 12

5

6

7

8

1

2

3

4

do i=1,4…
enddo

do i=5,8…
enddo!$omp parallel do private (ip,i,k,WVAL)
do ip= 1, 4
do i= INDEX(ip-1)+1, INDEX(ip)
WVAL= W(i,Z)
do k= indexL(i-1)+1, indexL(i)WVAL= WVAL - AL(k) * W(itemL(k),Z)
enddo
W(i,Z)= WVAL * W(i,DD)
enddo
enddo
!$omp parallel enddo

do i=9,12…
enddo

do i=13,16
…
enddo

100

INDEX(0)= 0
INDEX(1)= 4
INDEX(2)= 8
INDEX(3)=12
INDEX(4)=16

このような4スレッドが同時に実施される・・・

OMP-1

データ依存性：メモリへの書き出し，読み込みが同時に発生

13 14 15 169

10 11 12

5

6

7

8

1

2

3

4

!$omp parallel do private (ip,I,k,VAL)
do ip= 1, 4
do i= INDEX(ip-1)+1, INDEX(ip)
WVAL= W(i,Z)
do k= indexL(i-1)+1, indexL(i)WVAL= WVAL - AL(k) * W(itemL(k),Z)
enddo
W(i,Z)= WVAL * W(i,DD)
enddo
enddo
!$omp parallel enddo
13#1 thread#0 thread

1

5

⇔1

9

⇔ 9

⇔ 5
#2 thread#3 thread

101

INDEX(0)= 0
INDEX(1)= 4
INDEX(2)= 8
INDEX(3)=12
INDEX(4)=16⇔の部分にデータ依存性発生OMP-1102

ICCG法の並列化• 内積：OK• DAXPY：OK• 行列ベクトル積：OK• 前処理：なんとかしなければならない– 単純にOpenMPなどの指示行（directive）を挿入しただけ
では「並列化」できない。