応応応応応応応応 応応応応応 応応応応応応応応応応応応応応応応応応 応3応 応応応応応応応 応応応応 応応応応
Jan 23, 2016
応用数理工学特論
線形計算とハイパフォーマンスコンピューティング
第 3 回
計算理工学専攻 張研究室山本有作
前回の概要
「並列計算機による高性能計算」
1 . 並列計算機の種類と特徴
2 . 共有メモリ型並列計算機
– プログラミングモデル
– 高性能化の技法
今回の概要
「並列計算機による高性能計算」
3 . 分散メモリ型並列計算機
– プログラミングモデル
– 高性能化の技法
「連立一次方程式の高性能解法 (密行列の場合)」
1 . LU 分解
2 . LU 分解のブロック化
3 . LU 分解の並列化
3.1 分散メモリ型並列計算機のプログラミング
• 通信ライブラリ MPI
• MPI のプログラミングモデル• MPI の関数• 行列乗算の例
通信ライブラリ MPI
• MPI ( Message Passing Interface )– プロセッサ間通信を行うためのサブルーチンの集合
• MPI の機能– 1対1通信– ブロードキャスト– 総和演算・最大値– その他
MPI のプログラミングモデル
• SPMD ( Single Program Multiple Data )– 全プロセッサが共通のプログラムを実行– 処理するデータはプロセッサ毎に異なる。– 各プロセッサは固有の番号( 0, 1, … , p-1 )を持ち,プログ
ラム中で自分の番号を参照して処理を行う。
• 分散メモリ– 各プロセッサは自分の持つローカルメモリのみをアクセス
可能– 他プロセッサのメモリ上にあるデータが必要な場合は,プ
ロセッサ間通信により取得
MPI の関数
• 起動/終了– MPI_INIT : MPI の初期化– MPI_FINALIZE : MPI の終了
• 環境情報の取得– MPI_COMM_SIZE : 全プロセッサ台数の取得– MPI_COMM_RANK : プロセッサ番号の取得
• 1対1の送受信– MPI_SEND : データの送信– MPI_RECV : データの受信
• 集団通信– MPI_BCAST : データのブロードキャスト– MPI_REDUCE : リダクション演算(総和/最大値など)
A2
A3
行列乗算の例 (1)
• 問題– N×N 行列 A,B に対し,P 台のプロセッサを使って C = AB を計算– A はブロック行分割,B はブロック列分割されているとする。– 結果の C はブロック列分割の形で求めるとする。
– 各プロセッサは,行列の一部のみを持つ (分散メモリ)。– また,自分の持つ部分のみにアクセスできる。
A0
A1
PU0PU1PU2PU3
B0 B1 B2 B3× = C0 C1 C2 C3
PU0 PU3
行列乗算の例 (2)
• 計算の方針– 各 CJ を縦方向に P 個のブロック C0J, C1J, …, CP-1,J に分ける。– まず,自分の持つ部分行列のみで計算できる CJJ を計算– その後,他のプロセッサからデータをもらいながら, 他の CIJ を計算
program matmult(配列の確保: AJ,BJ,CJ ,ATMP )( MPI の初期化と環境情報取得。自分のプロセッサ番号を J とする。)(配列 AJ,BJ の初期化)CJJ = AJ×BJ
do I = 1, P-1 (プロセッサ MOD(J-I+P,P) に AJ を送る。) (プロセッサ MOD(J+I,P) から AMOD(J+I,P) を受け取り, ATMP に格納。) CMOD(J+I,P),J = ATMP×BJ
end do(配列 CJ の出力)( MPI の終了)stopend
3.2 高性能化の技法
• 基本的な考え方• 実行時間の予測• 行列乗算の例
基本的な考え方
• PU 間の負荷分散均等化– 各 PU の処理量が均等になるよう 処理を分割
• PU 間通信量の削減– 通信には,データ 1 個あたり数十サイクルの時間が必要– データ分割の最適化による通信量の削減と通信の隠蔽が重要
• PU 間通信回数の削減– 1 回の通信には通常,数百~数千サイクルの起動時間が必要– 並列粒度の増大による通信回数の削減が重要
• キャッシュメモリの有効利用
PU0 PU1 PU2 PU3キャッシュ
ネットワーク
メモリ
実行時間の予測
• 演算時間– Tcomp = (演算量)/(演算速度)
• もっとも単純なモデル化• より精密には,キャッシュの影響などを考慮する必要あり
• 通信時間– Tcomm = (転送回数) × (起動時間) + (転送量)/(転送速
度)
• 待ち時間– Tidle
• 全実行時間– Texec = Tcomp + Tcomm + Tidle
A2
A3
行列乗算の例• アルゴリズム
– A,C をブロック行分割,B をブロック列分割とした行列乗算
• 実行時間の予測– Tcomp = 2N3 / P / s :P に反比例して減少– Tcomm = (P – 1 ) * (Tsetup + (N / P) * N * 8 / b)
= (P – 1 ) * Tsetup + 8 (1 – 1 / P) N2 / b) :P とともに減少しない– Tidle = 0 :負荷は完全に均等
A0
A1
PU0PU1PU2PU3
B0 B1 B2 B3× = C0 C1 C2 C3
PU0 PU3
P を増やすと,並列化効率が大きく低下
通信の隠蔽
• アイディア– 行列 A のデータを,計算に必要な1ステップ前に送ってもらう。– 演算とのオーバーラップにより,通信時間を隠蔽できる。
– ただし,通信時間 ≦ 演算時間 でないと,隠蔽は不可能
program matmult(配列の確保: AJ,BJ,CJ ,ATMP )( MPI の初期化と環境情報取得。自分のプロセッサ番号を J とする。)(配列 AJ,BJ の初期化)(プロセッサ MOD(J-1+P,P) に AJ を送る。)CJJ = AJ×BJ
do I = 1, P-1 (プロセッサ MOD(J+I,P) から AMOD(J+I,P) を受け取り, ATMP に格納。) IF (I < P-1) (プロセッサ MOD(J-I+1+P,P) に AJ を送る。) CMOD(J+I,P),J = ATMP×BJ
end do(配列 CJ の出力)( MPI の終了)stopend
Fox のアルゴリズム (1)
• アルゴリズム– プロセッサを2次元に並べ,A,B,C を縦横両方向にブロック分割– プロセッサ (I,J) は,第 K ステップで CIJ += A I, MOD(I+K-1,√P) B MOD(I+K-1,√P), J を計算
B0 B1 B2 B3
× =
B0 B1 B2 B3
B0 B1 B2 B3
× =
B0 B1 B2 B3
A B C
AII の横方向
ブロードキャスト
CIJ += A II,B IJ
の計算
Fox のアルゴリズム (2)• 第 2 ステップ
B0 B1 B2 B3
× =
B0 B1 B2 B3
B0 B1 B2 B3
× =
B0 B1 B2 B3
A B C
BIJ の縦方向
サイクリック転送
CIJ += A I,I+1,B I+1,J
の計算
× =AI,I+1 の横方向
ブロードキャスト
Fox のアルゴリズム (3)
• アルゴリズム
program matmult(配列の確保: AIJ,BIJ,CIJ ,ATMP, BTMP )( MPI の初期化と環境情報取得。自分のプロセッサ番号を (I,J) とする。)(配列 AIJ,BIJ の初期化)do K = 1, √P IF (J = MOD(I+K,√P)) (配列 AIJ を ATMP にコピー) 配列 ATMP を行方向のプロセッサ間でブロードキャスト IF (K > 1) THEN (プロセッサ (MOD(I-1+P,P),J) に BTMP を送る。) (プロセッサ (MOD(I+1,P) から BTMP を受け取る。) ELSE ( BIJ を配列 BTMP にコピー) END IF CIJ += ATMP×BTMPend do(配列 CIJ の出力)( MPI の終了)stopend
Fox のアルゴリズムの MPI による実装• ATMP の横方向ブロードキャスト
– 同じ I の値を持つ PU 群に対してコミュニケータ(PUのグループ)を定義– コミュニケータを用い,MPI_BCAST によりブロードキャスト
• BTMP の縦方向サイクリック転送– MPI_SEND を用いて1つ上の PU にデータを送信– MPI_RECV を用いて1つ下の PU からデータを受信
B0 B1 B2 B3
× =
B0 B1 B2 B3
× =
Fox のアルゴリズムの性能モデル
• 実行時間の予測– Tcomp = 2N3 / P :P に反比例して減少
– Tcomm = √P * log2(√P) * (Tsetup + N2 / P * 8 / b) :ATMP の転送
+ (√P – 1 ) * (Tsetup + N2 / P * 8 / b) :BTMP の転送
– Tidle = 0 :負荷は完全に均等
P を増やすと,通信時間も 1/√P で減少P を増やしたときの並列化効率の低下が小さい。
より効率的な行列乗算
• 通信の隠蔽– ATMP の転送を,計算の1ステップ前に行う。
• 通信用バッファがもう1個必要• ノンブロッキング通信(MPI_ISEND,MPI_IRECV)を使うと,より効果的
• より効率的なアルゴリズムの利用– SUMMA (Scalable Universal Matrix Multiplication)
• LAPACK Working Notes 96 http://www.netlib.org/lapack/lawns/downloads/
連立一次方程式の高性能解法 (密行列の場合)
1 . LU 分解
2 . LU 分解のブロック化
3 . LU 分解の並列化
ガウスの消去法の性能
• n=1000 のときの性能は 250MFLOPS 程度
0
500
1000
1500
2000
2500
3000
3500
100 200 300 400 500 600 700 800 900 1000
Gaussian eliminationpeak performance