メニーコアCPUによ る高性能計算
高木 亮治
宇宙航空研究開発機構
宇宙科学研究所
圧縮性流体の数値解析(工学)
• 偏微分方程式の離散化
空間:計算格子
時間:ステップ
多数の繰り返し計算
• 実機解析
複雑物理、複雑形状
• 大規模・高性能計算
イプシロンロケット射場の音響解析(堤他)
• より複雑な現象をより正確に解析
大規模解析の必要性
提供:神戸大坪倉教授
• ロケットエンジン燃焼器の解析
インジェクタの本数:1本→本当は800~1,000本
火炎の計算:モデル(数ナノの厚さ)→詳細反応
格子点:8億点(~10
9)
計算性能:80TFLOPS(Tela=10
12、1兆)
計算時間:2週間→もっと速く(パラスタしたい)
大規模解析の必要性
最少格子幅:50-100ミクロン(LES), 数ナノ(火炎構造の解像)
Core i7 (Broadwell):0.5~1TFLOPS
https://www.quora.com/How-would-you-combine- liquid-hydrogen-and-oxygen-to-form-rocket-propellant
• CPUの速度は10年で約100倍(20年で1万倍)
• 並列数の増加:ノード、コア、SIMD、…
• メニーコアCPUのコア数
富士通PRIMEHPC FX100(SPARC64
TMXIfx):32コア
Intel Xeon Phi(KNL;KNight
Landing):64~72コア
NVIDIA Tesla P100:3,584コア
• 並列処理:仕事をみんなで分担して高速化
分担できるものと分担できないもの
-
分担できないものは高速化できない
数人で分担できても、数十、数百、…、数百万人で分担で きるか?
-「京」では8万ノード(64万コア)で分担
並列プログラムの作成
-
MPI, OpenMP, pthread, cuda, OpenACC, …
H/Wのトレンド:メニーコア
H/Wのトレンド:B/Fの低下
• 性能のバランス:演算、メモリ、ネットワーク
H/WとS/Wの相性にも依存
• CPUのByte/FLOPは長期減少傾向
流体解析は高B/Fを要求
アプリ側での対応も必要
-
アプリのB/Fを下げる
-
CPUのメモリバンド幅を最大限活用する
B/F of CPU 4 1 0.5 0.1
B/F of program
1 100% 100% 50% 10%
4 100% 25% 12.5% 2.5%
24 16.7% 4.2% 2.1% 0.42%
Systems Vector computers FX1 K-computer FX100 (L1$) (L2$)
a = b + c → B/F=24
・データ:(2+1)×8=24 [Bytes]
・演算:1
技術トレンド
目的
• データ処理(流体解析)の高速化を実現したい が、近年のCPUは簡単には性能が出せない。
• 流体解析を事例として、CPUの性能(メモリバ ンド幅)を最大限活用するための方策としてCP U特性の把握とそれを活用する手法について検 討を行った。
単なるプログラムの高速化チューニングとは逆
• 最新のメニーコアCPUのメモリ特性を紹介
SPARC64
TMXIfx@PRIMEHPC FX100
Intel Xeon Phi (KNL)
STREAM TRIAD とその拡張
do n=1,nmax
a(n) = b(n) + S * c(n)
enddo
STREAM TRIAD
0 200 400 600 800 1000 1200 1400
0.001 0.01 0.1 1 10 100 1000 10000
Memory Performance [GB/s]
Memory size [GB]
t64 t64(wo) p2t32 p4t16 p32t2 p64t1 p64t1(wo) L2$ (32MB) 434 GB/s
•
専用オプションでメモリ性能は向上するがL2$性能が低下
XFILL@FX100, opt-streaming-stores@KNL
•
HMC (Hybrid Memory Cube)の特性を改善
FX100 KNL
オプションの効果
オプションの効果 オプション
オプション の副作用
の副作用
実アプリのデータ・ループ構造へ
•
マルチブロック(構造体)、多次元配列、多重ループ、袖(Alignment)
MB-TRIAD:構造体
MB-TRIAD3D:構造体、多次元配列、多重ループ、袖
MB-TRIAD MB-TRIAD3D
type blkDataType
real(8), dimension(:), allocatable :: a,b,c end type blkDataType
type blkDataType
real(8), dimension(:,:,:), allocatable :: a,b,c end type blkDataType
type(blkDataType), dimension(:), allocatable :: blk do nb=1,nbmax
call kernel(blk(nb)%a,blk(nb)%b,blk(nb)%c,…) enddo
subroutine kernel(a,b,c,…) real(8), dimension(:) :: a,b,c do n
a(n) = b(n) + scalar*c(n) enddo
subroutine kernel(a,b,c,…) real(8), dimension(:,:,:) :: a,b,c do k; do j; do i;
a(i,j,k) = b(i,j,k) + scalar*c(i,j,k) enddo; enddo; enddo
←構造体ではなく配列渡し
(コンパイラの問題)
MB-TRIAD, MB-TRIAD3D
0 20 40 60 80 100 120 140 160
0 50 100 150 200 250 300
Memory Performance [GB/s]
grid_size for 3D / loop_length1/3 for TRIAD MB-TRIAD3D (ovlp=0) MB-TRIAD3D (ovlp=2) MB-TRIAD
•
FX100の結果
•
構造体はOK
キャッシュの影響を排除
•
性能劣化
ループ長が短い:XFILLが効
かない 多次元配列
•
袖の影響もあり
0 50 100 150 200 250 300 350 400
100 1000 10000 100000 1x106 1x107 1x108 0.0024 0.024 0.24 2.4 24 240 2400
Memory Performance [GB/s]
loop size memory size [MB]
Static Allocatable
Pointer L2-cache
メモリ性能
通常のTRIAD
MB-TRIAD
MB-TRIAD3D
do k=1,100 do j=1,100 do i=1,100
a(i,j,k) = b(i,j,k)+…
enddo; enddo; enddo do l=1,100*100*100
a(l) = b(l)+ … enddo
1D化(ループ長の増大)
program array
main do nb=1,nbmax
call kernel(blk(nb)%a,blk(nb)%b,blk(nb)%c,…) enddd
MB-TRIAD
subroutine kernel(a,b,c,…) real(8), dimension(:) :: a,b,c do n a(n) = b(n) + scalar*c(n) enddo
1次元配列 blk%a(:)
MB-TRIAD3D
subroutine kernel(a,b,c,…) real(8), dimension(:,:,:) :: a,b,c do k; do j; do i;
a(i,j,k) = b(i,j,k) + scalar*c(i,j,k)
enddo; enddo; enddo 多次元配列
blk%a(:,:,:) MB-TRIAD1D
subroutine kernel(a,b,c,…) real(8), dimension(*) :: a,b,c do l a(l) = b(l) + scalar*c(l)
enddo
MB-TRIAD3D/1D
0 50 100 150 200 250 300 350
0 50 100 150 200 250 300 350 400 450 500
Memory Performance [GB/s]
loop size
MB-TRIAD1D MB-TRIAD3D 315 GB/s (FX100)
0 50 100 150 200 250 300 350 400 450
0 50 100 150 200 250 300 350 400 450 500
Memory Performance [GB/s]
loop size
MB-TRIAD1D MB-TRIAD3D 434 GB/s (KNL)
• 1D化により高速化(FX100、KNLとも)
• KNLの立ち上がりが悪い(実際は短ループを利用)
FX100
MB-TRIAD3D
1D化効果
1D化効果
MB-TRIAD1DMB-TRIAD1D
MB-TRIAD3D
KNL
• 1D化によりループ長を確保(256以上)
ループが長くないとXFILLが効かない
-
L2$へのプリフェッチのため
• HMCの特性:Read/Writeが独立(240[GB/s]×2)
Readだけ、Writeだけ:ピーク性能が半分
Read/Write=1の時最大ピーク性能
• XFILLにより余分なReadを削減
Read/Writeを改善
H/Wのピーク性能を低下させない
• 以上の複合効果で高性能を発揮
1D化が有効な理由@FX100
a = b + c
XFILL あり なし
Read
23
Write 1 1
ピーク性 能[GB/s] 360 240
XFILL とは?( 1/2 )
•
データをメモリからロードすることなく書き込み時に書き込み用の キャッシュライン(中身は不定値)を確保する機能。
メモリからのキャッシュラインの読み込みを削減
書き込み配列の読み込みがないこと
do i=1,imax
a(i) = b(i) + c(i)
enddo
b c a
b c a
b c b + c → a
a b c
b c a
b c b + c → a
a
xfill
XFILLなし 4回 XFILLあり 3回
時間方向
レジスタ キャッシュ メモリ
XFILL とは?( 2/2 ) [HMC の特性も含む ]
演算式 XFILL 理論メモリバンド幅(1CPU=2CMGs)
a = a あり/なし LD:240GB/s+ST:240GB/s=480GB/s a = b
(a = (a) b) あり LD:240GB/s+ST:240GB/s=480GB/s A
なしLD:240GB/s×1/2+ST:240GB/s×1/2=240GB/s B a = a +b あり/なし LD:240GB/s+ST:240GB/s×1/2=360GB/s
a = b+c
(a = (a) b+c) あり LD:240GB/s+ST:240GB/s×1/2=360GB/s C
なしLD:240GB/s×2/3+ST:240GB/s×1/3=240GB/s D a = a +b+c あり/なし LD:240GB/s+ST:240GB/s×1/3=320GB/s
a = b+c+d
(a = (a) b+c+d) あり LD:240GB/s+ST:240GB/s×1/3=320GB/s E
なしLD:240GB/s×3/4+ST:240GB/s×1/4=240GB/s F
XFILL ST LD
0 1 2 3 4 5 6 7
あり 0 - 240 240 240 240 240 240 240
1 240 480(A) 360 (C) 320 (E) 300 288 280 274
なし 0 - 240 240 240 240 240 240 240