710 likes | 822 Views
実行時の情報を用いてプロセッサ間の通信を最適化するコンパイラ. 工学研究科 電子・情報工学専攻 995643 横田 大輔. 目次. 計算物理の高速化とその困難さ 本研究が目指すコンパイラ 従来の高速化手法 本研究で実装したコンパイラ 実験・結果 まとめ. 計算物理の高速化とその困難さ. 計算物理のシミュレーションはなぜ高速化が必要か. 実行時間が 長い 数日~数週間 維持費が 高価 日立 SR2201: 月500万円/月 116円/分≒日本⇔カナダの国際電話. 高速化を妨げる原因. プログラマ 計算機の 専門家でない 最適化をしない
E N D
実行時の情報を用いてプロセッサ間の通信を最適化するコンパイラ実行時の情報を用いてプロセッサ間の通信を最適化するコンパイラ 工学研究科 電子・情報工学専攻 995643 横田 大輔
目次 • 計算物理の高速化とその困難さ • 本研究が目指すコンパイラ • 従来の高速化手法 • 本研究で実装したコンパイラ • 実験・結果 • まとめ
計算物理のシミュレーションはなぜ高速化が必要か計算物理のシミュレーションはなぜ高速化が必要か • 実行時間が長い • 数日~数週間 • 維持費が高価 • 日立SR2201:月500万円/月 • 116円/分≒日本⇔カナダの国際電話 計算物理の高速化とその困難さ
高速化を妨げる原因 • プログラマ • 計算機の専門家でない • 最適化をしない • ハードウェア • 一般的な定石 • 記述が容易な通信パッケージが使われる • MPI, PVM • 記述が容易な言語が使われる • HPF 計算物理の高速化とその困難さ
MPI, PVM, HPF • 単純なインターフェース • 習得や記述が容易 • 可搬性がよい • ハードウェア独自の特徴を生かしにくい • ハードウェアの特徴を隠蔽している • 可搬性/容易な習得/容易な記述 計算物理の高速化とその困難さ
本研究の目標 • 実行時の情報を用いた最適化コンパイラ • 従来手法ではオーバーヘッドがあった。これを回避 • パラメータの参照 • 実行時の書き換え • コード生成時に実行時の情報を利用 • 通信を最適化する • 並列計算のボトルネック • 分散メモリ • 簡単な言語で記述可能 • ユーザが計算機の専門家ではない 本研究が目指すコンパイラ
実行時の情報をコンパイル時に利用 • 実行時の情報でコードを最適化 本研究が目指すコンパイラ
同じ 処理 INNERループ 本研究が対象にするプログラム • 典型的な計算物理のプログラムの構造 • 核になる計算を莫大な回数繰り返す • 核になる計算が行う通信は変らない くり返しでシミュレーション時間を表現 OUTERループ 最適化のための解析をするべき個所が決まってる 本研究が目指すコンパイラ
シミュレーションプログラムの例 空間でのエネルギーの変化 O U T E R ループ 現在の情報を元に 1 ( s e c ) 後を求めるために 1 ( n s e c ) 後の状態を 1, 0 0 0 , 0 0 0 , 0 0 0 回繰り返し 計算する I N N E R ループ 3 次の配列変数の値を 更新するための 3 重ループ D O I = 1 , . . . D O J = 1 , . . . D O K = 1 , . . . 本研究が目指すコンパイラ
これまでに行われてきた並列計算の高速化 • ソフトウェアの最適化 • 静的な解析 • 実行時の情報を利用 • ハードウェアの開発 • 目的の計算に特化 • 典型的な処理で効果を発揮する機能の追加 従来の高速化手法
実行時の情報で最適化 • ランタイムで調整 • 最適なパラメータを実行時に探す • コードを生成 • 実行時の情報でコードを再生成/書き換え • サポートツール 従来の高速化手法
在来の手法で何ができないか • 除去できないオーバーヘッドが存在 • 実行時情報を用いた場合に発生 • ランタイムでパラメータの調整 • パラメータの参照 • パラメータの設定 • 実行時書き換え • 自分自身を観測 • コードの書き換え 従来の高速化手法
実行時の情報による最適化 C. Ding99 J. Wu95 M. Voss99 P. Diniz97 R. Das93 S. Fink96 K.Tomako94 G. Viswanathan97 S.Sharma94 S.Leung93 N.Mitchell99 窪田99 M.Philipssen98 従来の高速化手法
ランタイムで調整 • ループのtiling, serializing [Voss99] • 同期の最適化 [Diniz97] • メッセージの融合 [Wu95] • マイグレーション、通信の隠蔽 [Viswanthan96] • マイグレーション、キャッシュ [Das93][Ding99] 従来の高速化手法
コードを生成 • オブジェクトを再配置[Philipssen98] • Java • 通信を減らす • 型と要素の数で発生する通信量を推測 • 型が静的に決まらない可能性がある 従来の高速化手法
サポートツール • ループのmining, unrolling (TEA)[佐藤98] • データの分割、スケジューリング、キャッシュ[Ponnusamy93] • データとループの繰り返しの最適なマッピング(間接参照の不規則ループ)[Hwang95] • ループのmining, unrolling (ATLAS) [Whaley01] 従来の高速化手法
ハードウェアの開発(専用機) • 目的の計算に特化 • QCDPAX[筑波大] • 素粒子物理: QCD ( Quantum Chromodynamics ) に特化 • GRAPE[東大] • 天文: n 体問題を解くことに特化 従来の高速化手法
ハードウェアの開発(汎用機) • 典型的な処理で効果を発揮する機能の追加 • CP-PACS / Pilot-3のRDMA(Remote DMA) • ブロックストライド通信 • TCW(Transfer Control Word)の再利用 • 片側通信 • 日立SR8000のRDMA+FMPL [建部01]インターフェース • TCWの再利用 • 片側通信 従来の高速化手法
ブロックストライド通信 ※ 多次元の配列の端を転送する場合に多発 従来の高速化手法
TCWの再利用 • 通信の設定時間を減らす 設定 do I=1,… end do do I=1,… end do 設定 送信 送信 通常の通信 TCW再利用型通信 従来の高速化手法
片側通信 • 明示的な受信命令が必要ない • 受信命令は同期用 • プログラマは余計な到着確認を減らすことが可能 • 受信側のメモリに直接書き込み • メモリコピーによるオーバーヘッドが少ない 従来の高速化手法
私が実装した並列化コンパイラ • 通信を最適化 • RDMA (CP-PACS/Pilot-3) • 最適化されたコードを生成 • 容易なプログラミング • Fortran77+HPF (High Performance Fortran) • いくつかのHPF命令+独自の命令をひとつ • 実行時の情報を用いる • ソースの性質を利用 • インスペクタ-エグゼキュータを利用 実装したコンパイラ
インスペクタ-エグゼキュータ • 実行時の情報を用いた並列化手法 • 実行時にパラメータを調整 • ループがターゲット • 先にプログラムの一部を実行して通信が必要になる個所を把握(インスペクタ) • 把握された情報を元に通信を行いながら実際に目的の計算を実行(エグゼキュータ) 実装したコンパイラ
生成 解析専用 ログ インスペクタ ルーチン 利用 計算専用 エグゼキュータ ルーチン インスペクタエグゼキュータとその利用 インスペクタ エグゼキュータ方式 本方式 実装したコンパイラ
本方式がコンパイル時に実行時情報を得る手法本方式がコンパイル時に実行時情報を得る手法 • OUTERループを一度だけ回って解析 • 独自の命令でプログラマが指示 • 核になる計算が行う通信は変らない • プログラマが保証 • 通信が必要になるデータのアドレス、時間、ソースコード上の位置を記録 • 分散配置される配列変数のアクセスを監視 • ループの制御変数の値を記録 実装したコンパイラ
実装した二つのコンパイラ コンパイル時にソースプログラムの一部を実行 • 1台のPCでコンパイル (IPSJ2001) • 目的の計算のプロセッサ1台分を実行する • 他のプロセッサも同じ動作をすると仮定 • 手軽 • PCクラスタでコンパイル (IASTED2002) • 目的の計算の全プロセッサ分を実行 • 並列計算機のプロセッサと1対1に対応 • 汎用性重視 実装したコンパイラ
予備コンパイル 予備実行 テーブル 解析 コード生成 解析方法(本方式の流れ:1台のPC版) ソースプログラム ソースの一部を実行 SPMDプログラム 実装したコンパイラ
ソースプログラム 予備コンパイル 予備コンパイル 〃 〃 予備実行 予備実行 テーブル テーブル 〃 〃 解析 解析 〃 データの交換 コード生成 コード生成 〃 コード融合 SPMDプログラム 解析方法(本方式の流れ:PCクラスタ版) 実装したコンパイラ
行った最適化 • 通信量の削減(PCクラスタ版のみ) • 通信が少なくなるようにループを分割 • INDEPENDENTと実行時情報を利用 • 通信回数の削減 • 通信回数が少なくなるようにブロックストライドを利用 • INDEPENDENTと実行時情報を利用 • 定数の畳み込み • 実行時の情報を定数として利用 • TCWの再利用 実装したコンパイラ
INDEPENDENT(HPF) • プログラマがコンパイラに与えるヒント(HPF) • ループの実行が計算結果に影響を与えない • 並列化の目印 実装したコンパイラ
PE1 PE2 … PE3 ループ 通信量の削減(1/4) • データの分割 • プログラマが指定(HPFディレクティブ) • ループの各反復を最適なプロセッサへ分配 • 受け持つと通信量(バイト)が最小になるプロセッサが受け持つ(実行時の情報) • 不連続可能 どのプロセッサがこの繰り返しを受け持てば 一番通信が少なくて済むだろうか? 実装したコンパイラ
通信量の削減(2/4) • 繰り返しの若い順にプロセッサに分配する • 通信量が一番小さくなるプロセッサに配る • 一つ前の繰り返しを処理するプロセッサに配る • 受け持ちの繰り返しの量が少ないプロセッサに配る • 条件を満たす中で最小のIDをもつプロセッサに配る 実装したコンパイラ
通信量の削減(3/4) INDEPENDENTループが多重な場合 • 分配して最も通信量の合計が少なくなる分け方ができたループを並列処理する DO1 DO2 ■ END DO END DO 並列DO1 DO2 ■ END DO END DO DO1 並列DO2 ■ END DO END DO 通信が 少ない コードを 採用 実装したコンパイラ
通信量の削減(4/4) 実装したコンパイラ
通信回数の削減(1/3) • 同時に送ることが可能なデータを探す(融合) • ハードウェアの制限を考慮しない • ブロックストライドで表現する(切出し) • 1で求めた同時に送ることが可能なデータの集合を、ハードウェアの制限に合わせる • 複数のブロックストライドが必要になる • パターンマッチング
通信回数の削減(2/3) (融合) • INDEPENDENT (HPF)を利用する • INDEPENDENTの範囲で通信を動かす • 同時に実行できる通信を融合 実装したコンパイラ
通信回数の削減(3/3) (切出し) 実装したコンパイラ
定数の畳み込み(1/2) • 必要になる通信を直接コードに書き込む • 実行時の情報によって得られた通信 • 大量の通信命令が生成される可能性がある • ループ制御変数でまとめる • 制御変数と定数で表現された一次式 実装したコンパイラ
定数の畳み込み(2/2) • ループのインデックスが小さい側に連続する二つの通信を探す。この二つの通信のパラメータを表す式を求める。 • さらに連続する通信があれば、パラメータがこの式に乗ることを確かめる。 • 2を繰り返す。 実装したコンパイラ
TCWの再利用 • TCWを再利用できるときは再利用する • 通信のパラメータが定数 設定 do I=1,… end do do I=1,… end do 設定 送信 送信 通常の通信 TCW再利用型通信 実装したコンパイラ
SPMDへ融合(クラスタのみ) • 複数のプログラムを1本に融合しなければならない • コード生成はクラスタノード • ターゲットマシンはSPMD • 命令単位で融合 • 単純にIF文+PIDで接続しない • コードサイズの爆発防止 実装したコンパイラ
X=X+1 X=X+9 X=X+1+PID*8 IF(PID.EQ.0)THEN ELSE END IF PID=0 PID=1 X=X+1 X=X+1 CALL F(P) CALL F(P) SPMDへ融合(2/4) • 命令単位で融合可能 • 命令単位で融合不可能 PID=0 PID=1 実装したコンパイラ
SPMDへ融合(3/4) • ソースプログラムの行番号をマーカーに使う • 並列化の際に追加された行は空のマーカーをつける • 複数のコードを頭からマッチングしていく • 同じ行番号がそろえば融合を試みる • 同じ行番号がそろわない、または空のマーカーが含まれる場合はIF文で結合、ずらして試行錯誤 実装したコンパイラ
SPMDへ融合(4/4) X+4 X+8 結合用の関数φnで結合 (X+4)*φ1(PID)+(X+8)*φ2(PID) このような四則演算式を求める(整式, ガウスの消去法) 式簡単化器 X+4+PID*4 実装したコンパイラ
実験 • ベンチマーク • Genesis distributed memory benchmarks pde1(N=7) • Nas parallel benchmarks FT-a BT-a • ヒントが少ないHPF • 実行環境 • Pilot3上の1~16ノード • コンパイル環境 • PCクラスタ : PIII733Mhz, 512Mbytes, 100Base, Linux RedHat7.1 1~16ノード, バックエンドに日立製最適化Fortran90コンパイラ 実験・結果