HPCS2011 Jan. 18-19, 2011 パケットペーシングによる 全対全通信の最適化と シミュレーション評価 ○柴村英智1) 平尾智也1) 清水俊幸2) 三輪英樹2) 安島雄一郎2) 石畑宏明3) 薄田竜太郎1) 三吉郁夫2) 井上弘士4) 1) 九州先端科学技術研究所 2) 富士通株式会社 3) 東京工科大学 4) 九州大学 背景と目的 ► 全対全通信(All-to-all) ► 同時送信可能なインターコネクトの提案 ► 複数の通信コントローラ(NIC)をルータに搭載 同時送信を用いた全対全通信アルゴリズムの提案(高上ら) 高速インターネット通信におけるペーシング ► インターコネクトへの負荷が高い(高トラフィック) アルゴリズムとインターコネクトのトポロジとの親和性が重要 高いネットワーク利用効率を達成 インターコネクトへの応用は少ない 全対全通信におけるパケットペーシングの効果を探る 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 2 発表の流れ ► 背景と目的 ► A2AT:最適全対全通信アルゴリズム ► NSIM:インターコネクトシミュレータ ► 評価対象システム ► 実験概要 ► 評価実験と結果 ► まとめ 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 3 A2AT:最適全対全通信アルゴリズム ► 高上、矢崎、安島、清水、石畑、“2次元Meshネット ワーク・Torusネットワーク上での最適全対全通信ア ルゴリズム”、HPCS2010 複数リンクを用いた同時送信を前提 常に全てのリンクを利用し、 Nホップ時に、高々N個の メッセージでリンクを共有 ホップ=1 2011/1/18 ホップ=2 ホップ=3 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 4 A2ATの実行フェーズ // alltoall by A2AT algorithm n = mat_size ; 偶数ノード数時の実行フェーズ if ( n % 2 == 0 ) { for ( i=0; i<n; i++ ) { if ( 0 < i && i <= (n-1)/2 ) { // Phase 1 recv( -i, 0, msg_size, NIC0, &r_req[0] ); recv( i, 0, msg_size, NIC1, &r_req[1] ); recv( 0, -i, msg_size, NIC2, &r_req[2] ); recv( 0, i, msg_size, NIC3, &r_req[3] ); send( i, 0, msg_size, NIC0, &s_req[0] ); send( -i, 0, msg_size, NIC1, &s_req[1] ); send( 0, i, msg_size, NIC2, &s_req[2] ); send( 0, -i, msg_size, NIC3, &s_req[3] ); waitall( 4, s_req, s_stat ); waitall( 4, r_req, r_stat ); } for ( j=0; j<n; j++ ) { if ( 0 < j && j < i && i <= (n-1)/2 ) { // Phase 3 recv( i, j, msg_size, NIC0, &r_req[0] ); recv( -i, -j, msg_size, NIC1, &r_req[1] ); recv( j, i, msg_size, NIC2, &r_req[2] ); recv( -j, -i, msg_size, NIC3, &r_req[3] ); send( -i, -j, msg_size, NIC0, &s_req[0] ); send( i, j, msg_size, NIC1, &s_req[1] ); send( -j, -i, msg_size, NIC2, &s_req[2] ); send( j, i, msg_size, NIC3, &s_req[3] ); waitall( 4, s_req, s_stat ); waitall( 4, r_req, r_stat ); if ( 0 < i && i <= (n-1)/2 ) { // Phase 2 recv( -i, -i, msg_size, NIC0, &r_req[0] ); recv( i, i, msg_size, NIC1, &r_req[1] ); recv( i, -i, msg_size, NIC2, &r_req[2] ); recv( -i, i, msg_size, NIC3, &r_req[3] ); send( i, i, msg_size, NIC0, &s_req[0] ); send( -i, -i, msg_size, NIC1, &s_req[1] ); send( -i, i, msg_size, NIC2, &s_req[2] ); send( i, -i, msg_size, NIC3, &s_req[3] ); waitall( 4, s_req, s_stat ); waitall( 4, r_req, r_stat ); } // Phase 4 recv( -j, i, msg_size, NIC0, &r_req[0] ); recv( j, -i, msg_size, NIC1, &r_req[1] ); recv( -i, j, msg_size, NIC2, &r_req[2] ); recv( i, -j, msg_size, NIC3, &r_req[3] ); send( j, -i, msg_size, NIC0, &s_req[0] ); send( -j, i, msg_size, NIC1, &s_req[1] ); send( i, -j, msg_size, NIC2, &s_req[2] ); send( -i, j, msg_size, NIC3, &s_req[3] ); waitall( 4, s_req, s_stat ); waitall( 4, r_req, r_stat ); for ( k=1; k<= n/2-1; k++ ) { // Phase 5 recv( -n/2, -k, msg_size, NIC0, &r_req[0] ); recv( n/2, k, msg_size, NIC1, &r_req[1] ); recv( -k, -n/2, msg_size, NIC2, &r_req[2] ); recv( k, n/2, msg_size, NIC3, &r_req[3] ); send( n/2, k, msg_size, NIC0, &s_req[0] ); send( -n/2, -k, msg_size, NIC1,&s_req[1] ); send( k, n/2, msg_size, NIC2, &s_req[2] ); send( -k, -n/2, msg_size, NIC3,&s_req[3] ); waitall( 4, s_req, s_stat ); waitall( 4, r_req, r_stat ); } // Phase 6 recv( n/2, n/2, msg_size, NIC0, &r_req[0] ); recv( -n/2, 0, msg_size, NIC1, &r_req[1] ); recv( 0, -n/2, msg_size, NIC2, &r_req[2] ); send( -n/2, -n/2, msg_size, NIC0, &s_req[0] ); send( n/2, 0, msg_size, NIC1, &s_req[1] ); send( 0, n/2, msg_size, NIC2, &s_req[2] ); waitall( 3, s_req, s_stat ); waitall( 3, r_req, r_stat ); } } } } 2011/1/18 ※send, recvは非同期通信 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 5 A2ATにおけるパケットペーシング ► Nホップ時に、高々N個のメッセージでリンクを共有 ► パケット間に(N-1)パケット分のギャップを予め挿 入し、リンクの帯域効率を向上 3ホップ時は、3メッセージで1リンクを共有 src dst パケットの流れ 2パケット分のギャップによるパケットペーシング 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 6 NSIM:インターコネクトシミュレータ ► 大規模インターコネクトの性能評価を目的 ► MGENプログラムと呼ぶ通信事象生成プログラムを 用いて、シミュレーション中に【通信事象】を生成 プログラム中の通信データは送受信しない #include <stdio.h> MGENプログラム例(Pairwise exchange) #include "mgen.h" int MGEN_Main( int argc, char *argv[] ) { : // Pairwise exchange for ( i=1; i<mysize; i++ ) { dst = src = myrank ^ i; MGEN_Irecv(NULL, msg_size, MGEN_BYTE, src, 0, MGEN_COMM_WORLD, &req[0]); MGEN_Isend(NULL, msg_size, MGEN_BYTE, dst, 0, MGEN_COMM_WORLD, &req[1]); MGEN_Wait(&req[1], &stat[1]); MGEN_Wait(&req[0], &stat[0]); } return (0); } 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 7 評価対象システム(1) ● トポロジ:n×n 2次元トーラス網 リンクバンド幅:4GB/s ■ ルーティング:次元順+日付変更線 ■ パケット転送方式:VCT(フリット長:16B) 仮想チャネルバッファ:2KiB(MTU)×4 パケット長:32B~2KiB(ヘッダ長:32B) 仮想チャネル数:2 ■ NIC数:4 ■ フロー制御方式:クレジットベース n +X -X +Y -Y 4GB/s 4GB/s 4GB/s 4GB/s +X -X +Y -Y n 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 8 評価対象システム(2) メモリ・DMA転送バンド幅: MPI関数処理オーバヘッド: ルーティング計算時間(RC): 仮想チャネル設定時間(VA): スイッチ設定時間(SA): フリット転送時間(ST): スイッチ遅延時間: ケーブル遅延時間: MPIプロセス数/ノード: 16GB/s 200ns 4ns 4ns 4ns 4ns 78ns 10ns 1 ※これらの仕様をコンフィグレーションファイルでNSIMに与える 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 9 コンフィグレーションファイルの例 (network name=“2dt-8x8" rank-node-filename=“2dt-8x8.rnc" number-of-NIC=4 number-of-virtual-channels=2 packetsize=2048 ; byte flitsize=16 ; byte mtusize=2048 ; byte packetheadersize=32 ; byte virtual-channel-buffersize=8192 ; byte routing-computation-time=4000 ; ps virtual-channel-allocation-time=4000;ps switch-allocation-time=4000 ; ps flit-traversal-time=4000 ; ps switch-latency=78000 ; ps cable-latency=10000 ; ps Tnrb=250 ; ps enable-pipelining=true connect-nodes-directly=true (topology name="3D Torus" X=8 Y=8 Z=1 2011/1/18 torus-X=true torus-Y=true torus-Z=true ) (mpi number-of-target-ranks=64 rendezvous-size-threshold=67108864 zerocopy-size-threshold=4 ; byte Tdma=250 ; ps Tnic=200000 ; ps Tcopy=250 ; ps Tpps=200000 ; ps Teps=200000 ; ps Tppr=200000 ; ps Tepr=200000 ; ps Tpw =200000 ; ps Tew =200000 ; ps Tcp =200000 ; ps Tce =200000 ; ps Tci =200000 ; ps ) ) All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 10 実験概要 実践的なシステム仕様に基づいた評価実験 インターコネクトシミュレータNSIMを利用 ► 実験1:全対全通信アルゴリズムの性能比較 ► 実験2:パケットペーシングによる性能改善 ► 実験3:シーケンス毎のチューニング ► 実験4:バリア同期によるインバランスの抑制 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 11 実験1:全対全通信アルゴリズムの性能比較 ► A2ATと他の全対全通信アルゴリズムを比較 アルゴリズム:a2at、pwx (pairwise exchange)、 ring、bruck ノード数:64(8×8)、256(16×16)、 1,024(32×32)、4,096(64×64) メッセージサイズ:64MiB÷ノード数 総有効データ転送量を同じにするため 評価指標 2011/1/18 a2at のみ、4NICを使った同時送信 MGEN実行時間(予想実行時間)、リンク帯域利用効率 次元毎・平均のリンクスループット(時系列) All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 12 a2at、pwx、ring、bruckの性能比較 ► 実行性能: a2at < pwx < ring < bruck ただし、a2at は4NICを利用した同時送信 a2at のリンク帯域利用効率が良くない ⇒次元軸毎にリンクバンド幅の時系列変化を調査 MGEN実行時間 2011/1/18 リンク帯域利用効率 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 13 時系列で見た次元毎のリンクバンド幅 ※2次元トーラス網 64ノード(8×8) 実行時間:71.3ms 理想実行時間:17.0ms 各軸のリンクを平等に利用 各軸の帯域効率が変化 a2at 隣接通信が多いため±X軸を多用 実行時間:87.0ms ホップ数の増加により+Y軸のリンク利用が増加 pwx 実行時間:115.5ms すべてのリンクを利用している機会が少ない ring 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 14 n×nの2次元トーラス網における 全対全通信の理想実行時間 Tideal Q Q (B) :Bisectionリンクを通過する総データ量 Bbisect n Q 2n 2 Bbisect 4nBlink 2 Tideal n 2 n 2 n 2 Lmesg Bbisect (B/sec):bisectionバンド幅 Lmesg (B):メッセージサイズ Blink (B/sec):リンクバンド幅 n Lmesg 2 B link ※本実験では、各パケットのヘッダ長もQに含め、理想実行時間を算出している 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 15 a2at-8x8と-9x9におけるリンクバンド幅 ► 偶数ノード数の場合、プログラム後半から通信性能が低下 次元順ルーティングとアルゴリズムとの齟齬が原因 a2at-8x8(偶数ノード数:64) 理想実行時間:17.0ms 各軸の帯域効率が変化 実行時間:71.3ms a2at-9x9(奇数ノード数:81) 理想実行時間:24.0ms 各軸のリンクを平等に利用 実行時間:84.0ms 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 16 a2at-8x8の平均VCバッファ利用率 バッファがほぼ飽和状態 (後続パケットをバッファできない) ※VC1は省略 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 17 2次元トーラス網8×8におけるa2at 30 | 43 | 35 | 28 | 37 | 45 | 32 | 58 ----+----+----+----+----+----+----+---41 | 14 | 19 |リンクを通過する 12 | 21 | 16 | 47 | 54 メッセージが多い ----+----+----+----+----+----+----+---33 | 17 | 6 | 4 | 8 | 23 | 39 | 50 ----+----+----+----+----+----+----+---26 | 10 | 2 | 0 | 1 | 9 | 25 | 62 ----+----+----+----+----+----+----+---40 | 24 | 7 | 3 | 5 | 18 | 34 | 49 ----+----+----+----+----+----+----+---48 | 15 | 22 | 11 | 20 | 13 | 42 | 53 ----+----+----+----+----+----+----+---31 | 46 | 38 | 27 | 36 | 44 | 29 | 57 ----+----+----+----+----+----+----+---60 | 56 | 52 | 63 | 51 | 55 | 59 | 61 2011/1/18 ► 偶数ノード数の場合、 アルゴリズム後半で 最右辺・最下辺との 通信が発生 ► +X (右)方向、およ び、-Y (下)方向へ の通信量が増加 ► +X方向の通信混 雑により実行時間が 増加 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 18 実験2:パケットペーシングによる性能改善 ► 全体を最適化するパケット間ギャップ値を求め、 ペーシングの効果を調査 アルゴリズム:a2at ノード数:64(8×8)、81(9×9)、… 、256(16×16) メッセージサイズ:1MiB 520×フルサイズパケット(2KiB)+1×小サイズパケット(288B) ルータ毎にパケット単位でアービトレーション パケット間ギャップ ハードウェアによるパケットペーシングを仮定 (ホップ数-1)+パケット間ギャップバイアス 2011/1/18 -2~+16 step 1.0 (0~+6については step 0.125) All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 19 各ギャップバイアスにおける実行時間 ► 適切なパケット間ギャップを与えることで、実行性能 が向上 パケットペーシングの効果を確認 ※アルゴリズム:a2at メッセージサイズ:1MiB 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 20 ペーシング時のリンクバンド幅 ► パケット間ギャップバイアス値:1.250 ► 実行性能は良くなっているが、リンク性能を十分に活用 していない 理想実行時間:17.0ms 理想実行時間:24.0ms 実行時間:42.7ms 実行時間:30.7ms A2AT-8x8(64ノード) A2AT-9x9(81ノード) ※アルゴリズム:a2at メッセージサイズ:1MiB 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 21 a2atの通信状況(2次元トーラス網 8x8) ペーシング無し 実行時間=71.3(ms) 59.9% ペーシング有り 実行時間=42.7(ms) ・ペーシングによって通信効率(奇数ノード数部)が改善 ・最終フェーズ部の通信状況は悪い 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 22 a2atの通信状況(2次元トーラス網 9x9) ペーシング無し 実行時間=84.0(ms) 36.5% ペーシング有り 実行時間=30.7(ms) ・ペーシングによって通信効率が改善 ・最終フェーズ部の通信状況も良好 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 23 ペーシングによる性能向上 シーケンス毎の最適化によって2倍以上の性能向上 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 24 実験3:シーケンス毎のチューニング ► 各シーケンス(実行フェーズ)の実行を最小化する バイアス値を求めた後、全シーケンスを統合実行 アルゴリズム:a2at ノード数:81(9×9) メッセージサイズ:1MiB パケット間ギャップ ► 2011/1/18 (ホップ数-1)+パケット間ギャップバイアス All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 25 各バイアス値におけるシーケンス実行時間 パケット間ギャップ:1.250 ※アルゴリズム:a2at メッセージサイズ:1MiB 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 26 全シーケンスの統合実行 ► 概ね最適なリンクバンド幅で実行している シーケンス15の性能が低い ⇒ シーケンス14の実行後のインバランスが原因 シーケンス14(ホップ数8)の通信中に他プロセスの シーケンス15が始まっている 理想実行時間:24.0ms 実行時間:25.8ms 107.5% シーケンス15 ※アルゴリズム:a2at ノード数:81(9×9) メッセージサイズ:1MiB 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 27 実験4:バリア同期によるインバランスの抑制 ► インバランスを抑制するために、シーケンス終了毎 にバリア同期を入れる アルゴリズム:a2at ノード数:81(9×9) メッセージサイズ:1MiB パケット間ギャップ バリア同期:ソフトウェアバリア(dissemination) 2011/1/18 (ホップ数-1)+パケット間ギャップバイアス 同期コスト:11.5μs@81ノード ⇒ 218.5μs@20シーケンス All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 28 バリア同期挿入後の全シーケンス実行 ► バリア同期のインバランスによって性能低下 バリア同期用の通信が、シーケンス実行の通信を妨害 バリア同期のインバランス量を調査 ⇒ 3μs未満 理想実行時間:24.0ms 実行時間:92.6ms ※アルゴリズム:a2at ノード数:81(9×9) メッセージサイズ:1MiB 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 29 バリア同期のインバランスを考慮した実行 ► インバランス状態で各シーケンスを個別に最適化し、全 シーケンスを統合実行 インバランス量:3μs、正規分布発生 理想実行時間:24.0ms 実行時間:32.8ms 136.7% ※アルゴリズム:a2at ノード数:81(9×9) メッセージサイズ:1MiB 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 30 まとめ と今後の課題 ► 同時送信機構を活用するA2ATの性能評価 ► 実践的な仕様では十分な性能を発揮できない場合がある A2ATにパケットペーシングを適用 通信アルゴリズムに適した積極的なペーシングが有効 各フェーズ実行開始時刻のインバランスに敏感 ► 最大で、理論値の107.5%で実行可能 余裕を持ったペーシングがポイント 今後の課題 2011/1/18 大規模システムを対象とした評価 様々な集団通信アルゴリズムを用いた評価 パケットペーシングの動的自動最適化 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 31 NSIMの一般公開 ► インターコネクトシミュレータNSIM(OpenNSIM)を 2010年11月17日より無償公開中 TaaS(Tools as a Service)と呼ぶクラウド環境から利用 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 32 OpenNSIM ポータルサイト https://ngarch.isit.or.jp/taas/opennsim/ OpenNSIM 検索 あるいは [swopp-announce:170454] 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 33 バックアップスライド 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 34 n×nの2次元トーラス網における 全対全通信の理想実行時間(1) 【全対全通信の理想実行時間】 bisection 0 1 理想実行時間: Tideal (sec) データ転送量:Q1 (B) データ転送量:Q2 (B) N-1 ※ N = n×n Tideal (sec) Q (B) Bbisect (B/sec) bisectionバンド幅: Bbisect (B/sec) Bisectionリンクを通過する 総データ量:Q (B) = Q1 + Q2 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 35 n×nの2次元トーラス網における 全対全通信の理想実行時間(2) 【Bisectionリンクを通過する総データ量:Q】 bisection n 2 n bisection n 2 n n 2 n 2 メッセージサイズ: Lmesg (B) n n Q1 n n Lmesg 2 2 Q1 n Q2 n n Q2 n n Lmesg 2 2 2次元トーラス網 Q2 (B) 2011/1/18 n n Q Q1 Q2 2n L mesg 2 2 2 Q1 (B) All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 36 n×nの2次元トーラス網における 全対全通信の理想実行時間(3) 【 2次元トーラス網における全対全通信の理想実行時間: Tideal 】 Tideal Q Bbisect n n Q 2n Lmesg 2 2 Bbisect (双方向) n (トーラスリンク) リンクバンド幅 2 2 n 2 Blink 4nBlink Tideal 2011/1/18 n 2 n 2 n Lmesg 2 B link All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 37 実験概要 ► 実験1:全対全通信アルゴリズムの性能比較 ► 実験2:パケットペーシングによる性能改善 ► A2ATにパケットペーシングを適用し、様々なパケット間 ギャップ値による性能を調査 実験3:シーケンス毎のチューニング ► A2AT、pairwise exchange、ringを比較 A2ATを細分化し、各シーケンスの最適なパケット間 ギャップを求めた後、統合実行 実験4:バリア同期によるインバランスの抑制 2011/1/18 バリア同期を各シーケンス終了後に挿入し、インバランス による性能低下を抑制した実行 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 38 本研究における同時送信 複数NICを用いて同時に複数のパケットをネットワークに投入 パケット NIC ネットワーク パケットの到着順に、送信開始 パケットの先頭を整えて、送信開始 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 39 NSIM:インターコネクトシミュレータ ► 大規模インターコネクトの性能評価を目的 ► MGENプログラムと呼ぶ通信事象生成プログラムを 用いて、シミュレーション中に【通信事象】を生成 ► シミュレーション結果 ► MGENプログラムの通信データは送受信しない 並列プログラム予想実行時間、実効バンド幅、実効リンク バンド幅、リンクビジー率、パケット待ち時間など多彩 並列離散事象シミュレーション(PDES)による、 NSIM自体の並列実装(MPI実装) 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 40 MGENプログラムの例 #include <stdio.h> #include "mgen.h" int MGEN_Main( int argc, char *argv[] ) { int myrank, mysize, i, src, dst, msg_size=1024; MGEN_Request req[2]; MGEN_Status stat[2]; MGEN_Comm_rank(MGEN_COMM_WORLD, &myrank); MGEN_Comm_size(MGEN_COMM_WORLD, &mysize); // mysize must be a power of 2 // Pairwise exchange for ( i=1; i<mysize; i++ ) { dst = src = myrank ^ i; MGEN_Irecv(NULL, msg_size, MGEN_BYTE, src, 0, MGEN_COMM_WORLD, &req[0]); MGEN_Isend(NULL, msg_size, MGEN_BYTE, dst, 0, MGEN_COMM_WORLD, &req[1]); MGEN_Wait(&req[1], &stat[1]); MGEN_Wait(&req[0], &stat[0]); } return (0); } 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 41 OpenNSIMにおける各種遅延の積算 送信側ランク CPU MPI_Send 受信側ランク 主記憶 NIC NIC 主記憶 CPU Tpps Tpsend Recv発行が早い Tppr Recv発行が遅い MPI_Recv Tcopy·Sm(m) Tdma·(Sp(1)+…+Sp(n-1))+Tnic·(n-1) Teps Tdma·Sp(n)+Tnic Twr(m) Tlws(m) Tprecv Ti(m) Tdma·Sp(n)+Tnic MPI_Recv Tcopy·Sm(m) Tppr Tcopy·Sm(m) Tepr MPI関数のスタート ネットワーク遅延を アップ遅延を積算 積算 •関数プロローグ、エピローグ •ルータ遅延 •メモリコピー(ユーザ⇒MPI) •ケーブル遅延 •DMA転送(主記憶⇒NIC) •衝突による遅延 など 2011/1/18 Tprecv Tepr MPI関数の後処理 時間を積算 •DMA転送(NIC⇒主記憶) •メモリコピー(MPI⇒ユーザ) •関数プロローグ、エピローグ All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 42 OpenNSIMの主な仕様(1) ► ノード数(Webブラウザから指定) ► トポロジ(Webブラウザから指定) ► 8~128Kノード 直接網:2次元メッシュ網、3次元メッシュ網 2次元トーラス網、3次元トーラス網 間接網:FatTree (2層 or 3層FBB接続) ルーティングアルゴリズム 直接網:次元順ルーティング+日付変更線 間接網:V-Up D-Down あるいは D-Up V-Down ※ V: Vertical D: Diagonal 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 43 OpenNSIMの主な仕様(2) ► ルータ リンクバンド幅:4GB/s※(単方向) パケット長:32B~2KiB※ パケット(仮想チャネル)バッファ長:8KiB※ フリット長:16B※ パケット転送方式:Virtual cut-through フロー制御方式:クレジットベース ※デフォルト値:設定ファイルを用いて変更可能 ► 評価アプリケーション(MGENプログラム) 2011/1/18 Point to point Random ring (HPCCより) Alltoall(pairwise exchange, ring, bruck) Allreduce(recursive doubling) ユーザが作成したMGENプログラム All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 44 OpenNSIMの主な仕様(3) ► 同期通信 ► 非同期通信 ► MGEN_Send()、MGEN_Recv() MGEN_Isend()、MGEN_Irecv()、MGEN_Wait() その他 MGEN_Comm_size() MGEN_Comm_rank() MGEN_Comp() 2011/1/18 指定された時間だけ、シミュレーション時間を進める。 ⇒ 既知の計算ブロックの演算時間を与えることで、アプリケーショ ン実行時間の推定精度を高めることができる。 ⇒ ロードインバランスやOSジッタを踏まえたシミュレーションも可能 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 45 OpenNSIMの主な仕様(4) ► 出力項目(時系列表示) ► ネットワークレイテンシ リンクスループット バッファ利用率 通信レイテンシ リンクスループットの割合の変動 輻輳の発生割合 出力項目(その他) 2011/1/18 輻輳箇所をノード・ポート毎に上位順で表示 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 46 OpenNSIMの入出力ファイル 入力ファイル 出力ファイル MGENプログラム 性能情報 コンフィグ レーション ランク・ノード 変換テーブル 2011/1/18 OpenNSIM 統計情報 通信履歴 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 47 a2at、pwx、ring、bruckの性能比較 2011/1/18 MGEN実行時間 リンク帯域利用効率 リンクビジー率 平均パケット待ち時間 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 48 リンク帯域効率と平均パケット待ち時間 ► 適切なパケット間ギャップ リンク帯域効率の向上 パケット待ち時間の減少 ※アルゴリズム:a2at メッセージサイズ:1MiB 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 49 pwxアルゴリズム for ( i=1; i<mysize; i++ ) { dst = src = myrank ^ i; MGEN_Irecv(,,, src,,, &req[0]); MGEN_Isend(,,, dst,,, &req[1]); MGEN_Wait(&req[1], &stat[1]); MGEN_Wait(&req[0], &stat[0]); } 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 50 ringアルゴリズム for ( i=1; i<mysize; i++ ) { src=(myrank-i +mysize)%mysize; dst=(myrank+i)%mysize; MGEN_Irecv(,,, src,,, &req[0]); MGEN_Isend(,,, dst,,, &req[1]); MGEN_Wait(&req[1], &stat[1]); MGEN_Wait(&req[0], &stat[0]); } 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 51 A2ATの通信状況 MGEN_Waitによる 受信待ち状態 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 52 pwxの通信状況 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 53 ringの通信状況 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 54 パケット間ギャップの指定方法 void send( int a, int b, int size, int nic, MGEN_Request *req ) float gap_bias ) { int myrank, mx, my; int dst; t_TsimRoutingInfo info; MGEN_Comm_rank(MGEN_COMM_WORLD, &myrank); mx = ( Xlevel( myrank ) + a + Xsize ) % Xsize; my = ( Ylevel( myrank ) + b + Ysize ) % Ysize; dst = RankXY( mx, my ); default_routing_info(&info); info.SrcNIC = nic; info.DstNIC = nic; info.gap = 8.0 * (( hop_2dt(myrank, dst) -1 + gap_bias); if ( info.gap < 0 ) info.gap = 0; } LMGEN_Isend( NULL, size, MGEN_BYTE, dst, MGEN_TAG0, MGEN_COMM_WORLD, req, &info, 1 ); 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 55 インターコネクト・コンフィグレーションファイル # 2dt-9x9.cfg : NSIM configuration file # generated by mkconfig.sh on Sat Jun 26 03:34:51 JST 2010 (simulation name="sim-2dt-9x9" : (network name="2dt-9x9" rank-node-filename="2dt-9x9.rnc" number-of-NIC=4 number-of-virtual-channels=2 packetsize=2048 ; byte flitsize=16 ; byte mtusize=2048 ; byte packetheadersize=32 ; byte virtual-channel-buffersize=8192 ; byte routing-computation-time=4000 ; ps virtual-channel-allocation-time=4000 ; ps switch-allocation-time=4000 ; ps flit-traversal-time=4000 ; ps switch-latency=78000 ; ps cable-latency=10000 ; ps Tnrb=62 ; ps enable-pipelining=true connect-nodes-directly=true 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 56 A2AT MGENプログラム(1 of 3) #include #include #include #include <stdio.h> <stdlib.h> <string.h> "mgen.h" py = abs( Ylevel(dst) - Ylevel(src) ); my = min( py, Ysize-py ); hop_y = min( py, my ); hop = hop_x + hop_y; #define BLOCKING_SENDRECV 0 return( hop ); } #endif #define MGEN_TAG0 0 #define MGEN_RANK0 0 #define #define #define #define NIC0 NIC1 NIC2 NIC3 0 1 2 3 // definitions for 2DT #define Xlevel(n) ( (n) % Xsize ) #define Ylevel(n) (((n) % ( Xsize * Ysize )) / Xsize ) #define RankXY(x,y) ( (x) + ((y) * Xsize) ) #ifdef USE_GAP #define max(a,b) (a>b?a:b) #define min(a,b) (a>b?b:a) #endif static int Xsize; static int Ysize; void send( int a, int b, int size, int nic, MGEN_Request *req ) float gap_bias ) { int myrank, mx, my; int dst; t_TsimRoutingInfo info; MGEN_Comm_rank(MGEN_COMM_WORLD, &myrank); mx = ( Xlevel( myrank ) + a + Xsize ) % Xsize; my = ( Ylevel( myrank ) + b + Ysize ) % Ysize; dst = RankXY( mx, my ); default_routing_info(&info); info.SrcNIC = nic; info.DstNIC = nic; #ifdef USE_GAP info.gap = 8.0 * (( hop_2dt(myrank, dst) -1 + gap_bias); if ( info.gap < 0 ) info.gap = 0; #endif static void default_routing_info(t_TsimRoutingInfo *info){ CONF_Default_routing(TSIM_MEVENT_SEND, 0, 0, MGEN_COMM_WORLD, info); } #if BLOCKING_SENDRECV LMGEN_Send( NULL, size, MGEN_BYTE, dst, #ifdef USE_GAP MGEN_TAG0, MGEN_COMM_WORLD, &info, 1 ); int hop_2dt( int src, int dst ) #else { LMGEN_Isend( NULL, size, MGEN_BYTE, dst, int hop; MGEN_TAG0, MGEN_COMM_WORLD, req, &info, 1 ); int hop_x, hop_y; #endif int px,mx,py,my; } px = abs( Xlevel(dst) - Xlevel(src) ); mx = min( px , Xsize-px ); hop_x = min( px, mx ); 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 57 A2AT MGENプログラム(2 of 3) void recv( int a, int b, int size, int nic, MGEN_Request *req ) { int myrank, mx, my; int src; t_TsimRoutingInfo info; MGEN_Status status; static int init = 0; // Main routine variables static int msg_size; // message size static int mat_size; // matrix size int n,rn; int i,j,k; MGEN_Comm_rank(MGEN_COMM_WORLD, &myrank); mx = ( Xlevel( myrank ) + a + Xsize ) % Xsize; my = ( Ylevel( myrank ) + b + Ysize ) % Ysize; src = RankXY( mx, my ); default_routing_info(&info); info.DstNIC = nic; #if BLOCKING_SENDRECV LMGEN_Recv( NULL, size, MGEN_BYTE, src, MGEN_TAG0, MGEN_COMM_WORLD, &status, &info, 1 ); #else LMGEN_Irecv( NULL, size, MGEN_BYTE, src, MGEN_TAG0, MGEN_COMM_WORLD, req, &info, 1 ); #endif } MGEN_Comm_rank(MGEN_COMM_WORLD, &myrank); MGEN_Comm_size(MGEN_COMM_WORLD, &mysize); if ( init==0 ) { init = 1; if ( argc == 3 ) { msg_size = atoi(argv[1]); mat_size = atoi(argv[2]); } else { if (myrank==0) printf("%% %s [message size] [matrix size]\n", argv[0]); exit(EXIT_FAILURE); } } void waitall( int arraysize, MGEN_Request *requests, MGEN_Status *statuses ) { #if ! BLOCKING_SENDRECV int i; for ( i=0; i< arraysize; i++ ) MGEN_Wait( &requests[i], &statuses[i] ); #endif } int MGEN_Main( int argc, char *argv[] ) { // MGEN variables int myrank; int mysize; MGEN_Request s_req[4], r_req[4]; MGEN_Status s_stat[4], r_stat[4]; // Initialization variable 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 58 A2AT MGENプログラム(3 of 3) // alltoall by ishihata-a2a algorithm Xsize = Ysize = n = mat_size ; for ( i=0; i<n; i++ ) { if ( 0 < i && i <= (n-1)/2 ) { recv( -i, 0, msg_size, NIC0, &r_req[0] recv( i, 0, msg_size, NIC1, &r_req[1] recv( 0, -i, msg_size, NIC2, &r_req[2] recv( 0, i, msg_size, NIC3, &r_req[3] send( i, 0, msg_size, NIC0, &s_req[0] send( -i, 0, msg_size, NIC1, &s_req[1] send( 0, i, msg_size, NIC2, &s_req[2] send( 0, -i, msg_size, NIC3, &s_req[3] waitall( 4, s_req, s_stat ); waitall( 4, r_req, r_stat ); } if ( 0 < i && i <= (n-1)/2 ) { recv( -i, -i, msg_size, NIC0, recv( i, i, msg_size, NIC1, recv( i, -i, msg_size, NIC2, recv( -i, i, msg_size, NIC3, send( i, i, msg_size, NIC0, send( -i, -i, msg_size, NIC1, send( -i, i, msg_size, NIC2, send( i, -i, msg_size, NIC3, waitall( 4, s_req, s_stat ); waitall( 4, r_req, r_stat ); } &r_req[0] &r_req[1] &r_req[2] &r_req[3] &s_req[0] &s_req[1] &s_req[2] &s_req[3] recv( -i, j, msg_size, NIC2, &r_req[2] ); recv( i, -j, msg_size, NIC3, &r_req[3] ); ); ); ); ); ); ); ); ); NIC0, NIC1, NIC2, NIC3, &s_req[0] &s_req[1] &s_req[2] &s_req[3] ); ); ); ); waitall( 4, s_req, s_stat ); waitall( 4, r_req, r_stat ); } } } if ( n % 2 == 0 ) { for ( k=1; k<= n/2-1; k++ ) { recv( -n/2, -k, msg_size, NIC0, &r_req[0] ); recv( n/2, k, msg_size, NIC1, &r_req[1] ); recv( -k, -n/2, msg_size, NIC2, &r_req[2] ); recv( k, n/2, msg_size, NIC3, &r_req[3] ); send( n/2, k, msg_size, NIC0, &s_req[0] ); send( -n/2, -k, msg_size, NIC1, &s_req[1] ); send( k, n/2, msg_size, NIC2, &s_req[2] ); send( -k, -n/2, msg_size, NIC3, &s_req[3] ); waitall( 4, s_req, s_stat ); waitall( 4, r_req, r_stat ); } recv( n/2, n/2, msg_size, NIC0, &r_req[0] ); recv( -n/2, 0, msg_size, NIC1, &r_req[1] ); recv( 0, -n/2, msg_size, NIC2, &r_req[2] ); send( -n/2, -n/2, msg_size, NIC0, &s_req[0] ); send( n/2, 0, msg_size, NIC1, &s_req[1] ); send( 0, n/2, msg_size, NIC2, &s_req[2] ); waitall( 3, s_req, s_stat ); waitall( 3, r_req, r_stat ); ); ); ); ); ); ); ); ); for ( j=0; j<n; j++ ) { if ( 0 < j && j < i && i <= (n-1)/2 ) { recv( i, j, msg_size, NIC0, &r_req[0] recv( -i, -j, msg_size, NIC1, &r_req[1] recv( j, i, msg_size, NIC2, &r_req[2] recv( -j, -i, msg_size, NIC3, &r_req[3] send( -i, -j, msg_size, NIC0, &s_req[0] send( i, j, msg_size, NIC1, &s_req[1] send( -j, -i, msg_size, NIC2, &s_req[2] send( j, i, msg_size, NIC3, &s_req[3] waitall( 4, s_req, s_stat ); waitall( 4, r_req, r_stat ); recv( -j, i, msg_size, NIC0, &r_req[0] recv( j, -i, msg_size, NIC1, &r_req[1] 2011/1/18 send( j, -i, msg_size, send( -j, i, msg_size, send( i, -j, msg_size, send( -i, j, msg_size, ); ); ); ); ); ); ); ); } return(EXIT_SUCCESS); } /* EOF */ ); ); All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 59 各シーケンスのリンクバンド幅 Seq-1 Seq-2 Seq-3 Seq-4 Seq-5 Seq-6 Seq-7 Seq-8 Seq-9 Seq-10 Seq-11 Seq-12 Seq-13 Seq-14 Seq-15 Seq-16 Seq-17 Seq-18 Seq-19 Seq-20 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 60 a2at-8x8の平均VCバッファ利用率 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 61 最適全対全通信アルゴリズム 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 62 A2AT:最適全対全通信アルゴリズム 2011/1/18 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 63 A2ATの実行フェーズ // alltoall by A2AT algorithm Xsize = Ysize = n = mat_size ; 偶数ノード数時の実行フェーズ for ( i=0; i<n; i++ ) { フェーズ単体実行用 if ( 0 < i && i <= (n-1)/2 ) { // Phase 1 ++cseq; gap = gaplist[cseq-1]; if ( myrank == 0 ) printf("seq %d: phase 1: gapbias=%.3f\n", cseq, gap); recv( -i, 0, msg_size, NIC0, &r_req[0] ); recv( i, 0, msg_size, NIC1, &r_req[1] ); recv( 0, -i, msg_size, NIC2, &r_req[2] ); recv( 0, i, msg_size, NIC3, &r_req[3] ); send( i, 0, msg_size, NIC0, &s_req[0], gap ); send( -i, 0, msg_size, NIC1, &s_req[1], gap ); send( 0, i, msg_size, NIC2, &s_req[2], gap ); send( 0, -i, msg_size, NIC3, &s_req[3], gap ); waitall( 4, s_req, s_stat ); waitall( 4, r_req, r_stat ); } if ( 0 < i && i <= (n-1)/2 ) { // Phase 2 ++cseq; gapbias = gaplist[cseq-1]; if ( myrank == 0 ) printf("seq %d: phase 2: gap=%.3f\n", cseq, gap); recv( -i, -i, msg_size, NIC0, &r_req[0] ); recv( i, i, msg_size, NIC1, &r_req[1] ); recv( i, -i, msg_size, NIC2, &r_req[2] ); recv( -i, i, msg_size, NIC3, &r_req[3] ); send( i, i, msg_size, NIC0, &s_req[0], gap ); send( -i, -i, msg_size, NIC1, &s_req[1], gap ); send( -i, i, msg_size, NIC2, &s_req[2], gap ); send( i, -i, msg_size, NIC3, &s_req[3], gap ); waitall( 4, s_req, s_stat ); waitall( 4, r_req, r_stat ); } 2011/1/18 for ( j=0; j<n; j++ ) { if ( 0 < j && j < i && i <= (n-1)/2 ) { // Phase 3 ++cseq; gap = gaplist[cseq-1]; if ( myrank == 0 ) printf("seq %d: phase 3: gap=%.3f\n", cseq, gap); recv( i, j, msg_size, NIC0, &r_req[0] ); recv( -i, -j, msg_size, NIC1, &r_req[1] ); recv( j, i, msg_size, NIC2, &r_req[2] ); recv( -j, -i, msg_size, NIC3, &r_req[3] ); send( -i, -j, msg_size, NIC0, &s_req[0], gap ); send( i, j, msg_size, NIC1, &s_req[1], gap ); send( -j, -i, msg_size, NIC2, &s_req[2], gap ); send( j, i, msg_size, NIC3, &s_req[3], gap ); waitall( 4, s_req, s_stat ); waitall( 4, r_req, r_stat ); // Phase 4 ++cseq; gap = gaplist[cseq-1]; if ( myrank == 0 ) printf("seq %d: phase 4: gap=%.3f\n", cseq, gap); recv( -j, i, msg_size, NIC0, &r_req[0] ); recv( j, -i, msg_size, NIC1, &r_req[1] ); recv( -i, j, msg_size, NIC2, &r_req[2] ); recv( i, -j, msg_size, NIC3, &r_req[3] ); send( j, -i, msg_size, NIC0, &s_req[0], gap ); send( -j, i, msg_size, NIC1, &s_req[1], gap ); send( i, -j, msg_size, NIC2, &s_req[2], gap ); send( -i, j, msg_size, NIC3, &s_req[3], gap ); waitall( 4, s_req, s_stat ); waitall( 4, r_req, r_stat ); if ( n % 2 == 0 ) { for ( k=1; k<= n/2-1; k++ ) { // Phase 5 ++cseq; gap = gaplist[cseq-1]; if ( myrank == 0 ) printf("seq %d: phase 5: gap=%.3f\n", cseq, gap); recv( -n/2, -k, msg_size, NIC0, &r_req[0] ); recv( n/2, k, msg_size, NIC1, &r_req[1] ); recv( -k, -n/2, msg_size, NIC2, &r_req[2] ); recv( k, n/2, msg_size, NIC3, &r_req[3] ); send( n/2, k, msg_size, NIC0, &s_req[0], gap ); send( -n/2, -k, msg_size, NIC1, &s_req[1], gap ); send( k, n/2, msg_size, NIC2, &s_req[2], gap ); send( -k, -n/2, msg_size, NIC3, &s_req[3], gap ); waitall( 4, s_req, s_stat ); waitall( 4, r_req, r_stat ); } // Phase 6 ++cseq; gap = gaplist[cseq-1]; if ( myrank == 0 ) printf("seq %d: phase 6: gap=%.3f\n", cseq, gapbias); recv( n/2, n/2, msg_size, NIC0, &r_req[0] ); recv( -n/2, 0, msg_size, NIC1, &r_req[1] ); recv( 0, -n/2, msg_size, NIC2, &r_req[2] ); send( -n/2, -n/2, msg_size, NIC0, &s_req[0], gap ); send( n/2, 0, msg_size, NIC1, &s_req[1], gap ); send( 0, n/2, msg_size, NIC2, &s_req[2], gap ); waitall( 3, s_req, s_stat ); waitall( 3, r_req, r_stat ); } } } } ※send, recvは非同期通信 All Rights Reserved, Copyright © Institute of Systems, Information Technologies and Nanotechnologies 2011 64
© Copyright 2024 ExpyDoc