3/26 ハイブリッド並列化 (1/2) Process Process Process Process Process Process Process Process Flat-MPI 計算領域を分割し、CPUコアそれぞれに割り当てる 各CPUコア間で直接通信を行う 利点:プログラムが楽 欠点:プロセス数の増加でメモリ使用量が飛躍的に増加 → 「京」フルノードflat-MPIは不可能 → ハイブリッド不可避
13/26 AVX2を用いたSIMD化 (2/5) パディング付きAoS データを粒子数*4成分の二次元配列で宣言 double q[N][4], p[N][4]; Z Y X Z Y X Z Y X Z Y X うれしいこと (x,y,z)の3成分のデータを256bitレジスタに一発ロード ただし、1成分(64bit) は無駄になる Z Y X Z Y X Z Y X Z Y X movupd/movapd ymm Z Y X
17/26 AVX-512を用いたSIMD化 (1/4) gather/scatter D C B A メモリ レジスタ D C B A AVX2まではバラバラに持ってくると遅かった H G F E D C メモリ レジスタ H G F E AVX-512では、メモリから8要素同時にバラバラにロードできる (gather) D C B A B A バラバラにストアできるscatterもある
21/26 データ構造の工夫 (1/4) データ構造をSoAに AoS Z Y X Z Y X Z Y X Z Y X SoA Z Z Z Z Z Y Y Y Y Y X X X X X ループの端数処理最適化 ・ループ回転数が8の倍数でない余りの処理も一度にまわしてしまう ・「余り」はvpcmpqでマスクを作ってゼロクリア (kand) ・運動量の書き戻しをマスク付きscatterに (ループ端数をまたぐとインデックス衝突の可能性がある) ソフトウェアパイプライニング(SWP) ループを「半個ずらし」して、異なる処理を重ね、IPC向上を狙う ・データが連続になるため、j粒子のインデックスのビットシフトが不要になる
23/26 データ構造の工夫 (3/4) もう少し頑張る Z Z Z Z Z Y Y Y Y Y X X X X X SoA VZ VZ VZ VZ VZ VY VY VY VY VY VX VX VX VX VX 座標 運動量 Cache Line Size (512 Byte) AoS 8-packed 0 VZ VY VX 0 Z Y X 0 VZ VY VX 0 Z Y X 一つの粒子の情報 Cache Line Size (512 Byte) Cache Line Size (512 Byte) データ構造をSoAからAoSの8要素パックに 一つの粒子の情報がちょうどキャッシュラインサイズに一致する キャッシュライン完食率 75%