Microsoft PowerPoint - 第10回講義(2015年12月22日)-1 .pptx

Similar documents
第8回講義(2016年12月6日)

Microsoft PowerPoint - KHPCSS pptx

Microsoft PowerPoint _MPI-03.pptx

PowerPoint プレゼンテーション

Microsoft PowerPoint _MPI-01.pptx

Microsoft PowerPoint - 演習2:MPI初歩.pptx

Microsoft PowerPoint - 講義:片方向通信.pptx

Microsoft PowerPoint - 阪大CMSI pptx

NUMAの構成

コードのチューニング

並列計算導入.pptx

演習準備

<4D F736F F F696E74202D D F95C097F D834F E F93FC96E5284D F96E291E85F8DE391E52E >

Microsoft PowerPoint - 演習1:並列化と評価.pptx

(Microsoft PowerPoint \211\211\217K3_4\201i\216R\226{_\211\272\215\342\201j.ppt [\214\335\212\267\203\202\201[\203h])

演習準備 2014 年 3 月 5 日神戸大学大学院システム情報学研究科森下浩二 1 RIKEN AICS HPC Spring School /3/5

PowerPoint プレゼンテーション

MPI コミュニケータ操作

スライド 1

内容に関するご質問は まで お願いします [Oakforest-PACS(OFP) 編 ] 第 85 回お試しアカウント付き並列プログラミング講習会 ライブラリ利用 : 科学技術計算の効率化入門 スパコンへのログイン テストプログラム起動 東京大学情報基盤セ

C/C++ FORTRAN FORTRAN MPI MPI MPI UNIX Windows (SIMD Single Instruction Multipule Data) SMP(Symmetric Multi Processor) MPI (thread) OpenMP[5]

120802_MPI.ppt

演習 II 2 つの講義の演習 奇数回 : 連続系アルゴリズム 部分 偶数回 : 計算量理論 部分 連続系アルゴリズム部分は全 8 回を予定 前半 2 回 高性能計算 後半 6 回 数値計算 4 回以上の課題提出 ( プログラム + 考察レポート ) で単位

Microsoft PowerPoint - MPIprog-F2.ppt [互換モード]

第9回講義(2016年6月14日)-2

スライド 1

Microsoft PowerPoint - 講義:コミュニケータ.pptx

GeoFEM開発の経験から

スライド 1

about MPI

スライド 1

Reedbush-Uアカウントの発行

<4D F736F F F696E74202D C097F B A E B93C782DD8EE682E890EA97705D>

講義の流れ 並列プログラムの概要 通常のプログラムと並列プログラムの違い 並列プログラム作成手段と並列計算機の構造 OpenMP による並列プログラム作成 処理を複数コアに分割して並列実行する方法 MPI による並列プログラム作成 ( 午後 ) プロセス間通信による並列処理 処理の分割 + データの

スライド 1

講習会 :MPI 基礎 2 講習会概略 開催日 : 2017 年 3 月 6 日 ( 月 ) 10:30-17: 年 3 月 7 日 ( 火 ) 10:00-17:00 場所 : 東京大学情報基盤センター 4 階 413 遠隔会義室 講習会プログラム : 3 月 6 日 ( 月 ) 1

Microsoft PowerPoint - MPIprog-C2.ppt [互換モード]

memo

課題 S1 解説 Fortran 編 中島研吾 東京大学情報基盤センター

コードのチューニング

演習1

講習会 :MPI 基礎 2 講習会概略 開催日 : 2016 年 9 月 12 日 ( 月 ) 10:30-17: 年 9 月 13 日 ( 火 ) 10:00-17:00 場所 : 東京大学情報基盤センター 4 階 413 遠隔会義室 講習会プログラム : 9 月 12 日 ( 月

Microsoft PowerPoint MPI.v...O...~...O.e.L.X.g(...Q..)

2018/10/18 講習会 :MPI 基礎 1 第 105 回お試しアカウント付き並列プログラミング講習会 MPI 基礎 : 並列プログラミング入門 東京大学情報基盤センター 内容に関するご質問は cc.u-tokyo.ac.jp まで お願いします

2007年度 計算機システム演習 第3回

情報処理概論(第二日目)

<4D F736F F F696E74202D F A282BD94BD959C89F A4C E682528D652E707074>

Microsoft PowerPoint - S1-ref-F.ppt [互換モード]

Microsoft PowerPoint - ca ppt [互換モード]

cp-7. 配列

Microsoft PowerPoint - VBA解説1.ppt [互換モード]

マニュアル訂正連絡票

Microsoft PowerPoint - 高速化WS富山.pptx

第 125 回お試しアカウント付き並列プログラミング講習会 MPI 基礎 : 並列プログラミング入門 東京大学情報基盤センター 内容に関するご質問は cc.u-tokyo.ac.jp まで お願いします

untitled

memo

Microsoft PowerPoint - 09.pptx

untitled


4th XcalableMP workshop 目的 n XcalableMPのローカルビューモデルであるXMPのCoarray機能を用 いて Fiberミニアプリ集への実装と評価を行う PGAS(Pertitioned Global Address Space)言語であるCoarrayのベ ンチマ

NUMAの構成

研究背景 大規模な演算を行うためには 分散メモリ型システムの利用が必須 Message Passing Interface MPI 並列プログラムの大半はMPIを利用 様々な実装 OpenMPI, MPICH, MVAPICH, MPI.NET プログラミングコストが高いため 生産性が悪い 新しい並

Fujitsu Standard Tool

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

演習2

memo

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1


86

gengo1-11

Microsoft Word - UT_SCnews教育報告(200905_ver3.doc

arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ

chap2.ppt

Fundamental MPI 1 概要 MPI とは MPI の基礎 :Hello World 全体データと局所データタ グループ通信 (Collective Communication) 1 対 1 通信 (Point-to-Point Communication)

TFTP serverの実装

tabaicho3mukunoki.pptx

MPI 超 入門 (FORTRAN 編 ) 東京大学情報基盤センター C 言語編は以下 /ohshima/seminars/t2k201111/ (MPI による並列アプリケーション開発入門 2)

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

09.pptx

メソッドのまとめ

MPI

講義の進め方 第 1 回イントロダクション ( 第 1 章 ) 第 2 ~ 7 回第 2 章 ~ 第 5 章 第 8 回中間ミニテスト (11 月 15 日 ) 第 9 回第 6 章 ~ 第 回ローム記念館 2Fの実習室で UML によるロボット制御実習 定期試験 2

PowerPoint プレゼンテーション

スライド 1

講 習 会 概 略 開 催 日 : 2013 年 3 月 24 日 ( 月 )10:30-18: 年 3 月 25 日 ( 火 )10:30-18:00 場 所 : 東 京 大 学 情 報 基 盤 センター 4 階 413 遠 隔 講 義 室 講 習 会 プログラム: 3 月 24 日

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Fundamental MPI 1 概要 MPI とは MPI の基礎 :Hello World 全体データと局所データタ グループ通信 (Collective Communication) 1 対 1 通信 (Point-to-Point Communication)

memo

Fundamental MPI 1 概要 MPI とは MPI の基礎 :Hello World 全体データと局所データ グループ通信 (Collective Communication) 1 対 1 通信 (Point-to-Point Communication)

Microsoft PowerPoint - OS04.pptx

第1回 プログラミング演習3 センサーアプリケーション

プログラミング実習I

AquesTalk for WinCE プログラミングガイド

Microsoft Word ●IntelクアッドコアCPUでのベンチマーク_吉岡_ _更新__ doc

Microsoft PowerPoint - OS07.pptx

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

< 中略 > 24 0 NNE 次に 指定した日時の時間降水量と気温を 観測地点の一覧表に載っているすべての地点について出力するプログラムを作成してみます 観測地点の一覧表は index.txt というファイルで与えられています このファイルを読みこむためのサブルーチンが AMD

Microsoft Word - 3new.doc

2 T 1 N n T n α = T 1 nt n (1) α = 1 100% OpenMP MPI OpenMP OpenMP MPI (Message Passing Interface) MPI MPICH OpenMPI 1 OpenMP MPI MPI (trivial p

Transcription:

非同期通信 東京大学情報基盤センター准教授片桐孝洋 1 2015 年 12 月 22 日 ( 火 )10:25-12:10

講義日程 ( 工学部共通科目 ) 10 月 6 日 : ガイダンス 1. 10 月 13 日 並列数値処理の基本演算 ( 座学 ) 2. 10 月 20 日 : スパコン利用開始 ログイン作業 テストプログラム実行 3. 10 月 27 日 高性能演算技法 1 ( ループアンローリング ) 4. 11 月 10 日 高性能演算技法 2 ( キャッシュブロック化 ) 5. 11 月 24 日 行列 - ベクトル積の並列化 6. 12 月 1 日 (8:30 ー 10:15) 2 べき乗法の並列化 6. 12 月 1 日 (10:25 ー 12:10) スパコンプログラミング (1) (Ⅰ) 行列 - 行列積の並列化 (1) 7. 12 月 8 日 行列 - 行列積の並列化 (2) 8. 12 月 15 日 LU 分解法 (1) コンテスト課題発表 9. 12 月 22 日 計算機保守のため座学 ソフトウエア自動チューニング 非同期通信 10. 2016 年 1 月 5 日 LU 分解法 (2) 12. 1 月 12 日 レポートおよびコンテスト課題 ( 締切 : 2016 年 2 月 11 日 ( 木 )24 時厳守 LU 分解法 (3)

講義の流れ 1. 1 対 1 通信に関するMPI 用語 2. サンプルプログラム ( 非同期通信 ) の実行 3. レポート課題 3

通信最適化の方法 4

メッセージサイズと通信回数 通信時間 [ 秒 ] 通信立ち上がり時間 = 通信レイテンシ [ 秒 ] 0 領域 1 メッセージサイズに依存せず ほぼ一定時間の領域 通信レイテンシ 2 [ 秒 ] 領域 2 メッセージサイズに比例して 実行時間が増えていく領域 1 / 傾き係数 [ 秒 / バイト ] = メモリバンド幅 [ バイト / 秒 ] 数百バイト 領域 2 の通信時間の計算式 通信時間 = 通信レイテンシ 2 + 傾き係数 メッセージサイズ メッセージサイズ [ バイト ] 5

通信最適化時に注意すること ( その 1) 自分のアプリケーションの通信パターンについて 以下の観点を知らないと通信の最適化ができない < 領域 1>< 領域 2> のどちらになるのか 通信の頻度 ( 回数 ) はどれほどか 領域 1 の場合 通信レイテンシ が実行時間のほとんど 通信回数を削減する 細切れに送っているデータをまとめて 1 回にする など 領域 2 の場合 6 メッセージ転送時間 が実行時間のほとんどメッセージサイズを削減する冗長計算をして計算量を増やしてでもメッセージサイズを削減する など

領域 1 となる通信の例 内積演算のためのリダクション (MPI_Allreduce) などの送信データは倍精度 1 個分 (8 バイト ) 8 バイトの規模だと 数個分を同時に MPI_Allreduce する時間と 1 個分を MPI_Allreduce をする時間は ほぼ同じ時間となる 複数回分の内積演算を一度に行うと高速化される可能性あり 例 ) 連立一次方程式の反復解法 CG 法中の内積演算 通常の実装だと 1 反復に 3 回の内積演算がある このため 内積部分は通信レイテンシ律速となる k 反復を 1 度に行えば 内積に関する通信回数は 1/k 回に削減 ただし 単純な方法では 丸め誤差の影響で収束しない 通信回避 CG 法 (Communication Avoiding CG, CACG) として現在活発に研究されている 7

通信最適化時に注意すること ( その 2) 同期点 を減らすことも高速化につながる MPI 関数の ノン ブロッキング関数 を使う 例 : ブロッキング関数 MPI_SEND() ノン ブロッキング関数 MPI_ISEND() 通信と演算を同時に行うようにする 同期点 ランク 0 計算 send 受信待計算 send 受信待計算 send 受信待 ランク 1 計算 recv 計算 recv 計算 recv ノン ブロッキング関数の利用 ランク 0 計算 isend 計算 isend 計算 isend 高速化 ランク 1 計算 irecv 計算 irecv 計算 irecv 8

非同期通信 : Isend Irecv 永続的通信関数 9

ブロッキング通信で効率の悪い例 プロセス 0 が必要なデータを持っている場合 連続する send で 効率の悪い受信待ち時間が多発 プロセス 0 計算 send 受信待 send 受信待 send 受信待 計算 プロセス 1 計算 recv 計算 次の反復での同期待ち プロセス 2 計算 recv 計算 次の反復での同期待ち プロセス 3 計算 recv 計算 次の反復での同期待ち 次の反復での同期点 10

1 対 1 通信に対する MPI 用語 ブロッキング? ノンブロッキング? 11

ブロッキング ノンブロッキング 1. ブロッキング 送信 / 受信側のバッファ領域にメッセージが格納され 受信 / 送信側のバッファ領域が自由にアクセス 上書きできるまで 呼び出しが戻らない バッファ領域上のデータの一貫性を保障 2. ノンブロッキング 12 送信 / 受信側のバッファ領域のデータを保障せずすぐに呼び出しが戻る バッファ領域上のデータの一貫性を保障せず 一貫性の保証はユーザの責任

ローカル ノンローカル ローカル 手続きの完了が それを実行しているプロセスのみに依存する ほかのユーザプロセスとの通信を必要としない処理 ノンローカル 操作を完了するために 別のプロセスでの何らかの MPI 手続きの実行が必要かもしれない 別のユーザプロセスとの通信を必要とするかもしれない処理 13

通信モード ( 送信発行時の場合 ) 1. 標準通信モード ( ノンローカル ) : デフォルト 送出メッセージのバッファリングは MPI に任せる バッファリングされるとき : 相手の受信起動前に送信を完了可能 ; バッファリングされないとき : 送信が完全終了するまで待機 ; 2. バッファ通信モード ( ローカル ) 必ずバッファリングする バッファ領域がないときはエラー 3. 同期通信モード ( ノンローカル ) バッファ領域が再利用でき かつ 対応する受信 / 送信が開始されるまで待つ 4. レディ通信モード ( 処理自体はローカル ) 14 対応する受信が既に発行されている場合のみ実行できる それ以外はエラー ハンドシェーク処理を無くせるため 高い性能を発揮する

実例 -MPI_Send MPI_Send 関数 ブロッキング 標準通信モード ( ノンローカル ) 15 バッファ領域が安全な状態になるまで戻らない バッファ領域がとれる場合 : メッセージがバッファリングされる 対応する受信が起動する前に 送信を完了できる バッファ領域がとれない場合 : 対応する受信が発行されて かつ メッセージが受信側に完全にコピーされるまで 送信処理を完了できない

非同期通信関数 ierr = MPI_Isend(sendbuf, icount, datatype, idest, itag, icomm, irequest); sendbuf : 送信領域の先頭番地を指定する icount : 整数型 送信領域のデータ要素数を指定する datatype : 整数型 送信領域のデータの型を指定する idest : 整数型 送信したい PE の icomm 内でのランクを指定する itag : 整数型 受信したいメッセージに付けられたタグの値を指定する 16

非同期通信関数 icomm : 整数型 PE 集団を認識する番号であるコミュニケータを指定する 通常では MPI_COMM_WORLD を指定すればよい irequest : MPI_Request 型 ( 整数型の配列 ) 送信を要求したメッセージにつけられた識別子が戻る ierr : 整数型 エラーコードが入る 17

同期待ち関数 ierr = MPI_Wait(irequest, istatus); irequest : MPI_Request 型 ( 整数型配列 ) 送信を要求したメッセージにつけられた識別子 istatus : MPI_Status 型 ( 整数型配列 ) 受信状況に関する情報が入る 要素数が MPI_STATUS_SIZE の整数配列を宣言して指定する 受信したメッセージの送信元のランクが istatus[mpi_source] タグが istatus[mpi_tag] に代入される 18

実例 -MPI_Isend MPI_Isend 関数 ノンブロッキング 標準通信モード ( ノンローカル ) 通信バッファ領域の状態にかかわらず戻る バッファ領域がとれる場合は メッセージがバッファリングされ 対応する受信が起動する前に 送信処理が完了できる バッファ領域がとれない場合は 対応する受信が発行され メッセージが受信側に完全にコピーされるまで 送信処理が完了できない MPI_Wait 関数が呼ばれた場合の振舞いと理解すべき 19

注意点 以下のように解釈してください : MPI_Send 関数 関数中に MPI_Wait 関数が入っている ; MPI_Isend 関数 関数中にMPI_Wait 関数が入っていない ; かつ すぐにユーザプログラム戻る ; 20

並列化の注意 (MPI_Send MPI_Recv) 全員が MPI_Send を先に発行すると その場所で処理が止まる (cf. 標準通信モードを考慮 ) ( 正確には 動いたり 動かなかったり する ) MPI_Send の処理中で 場合により バッファ領域がなくなる バッファ領域が空くまで待つ ( スピンウェイトする ) しかし 送信側バッファ領域不足から 永遠に空かない これを回避するためには 例えば以下の実装を行う ランク番号が 2 で割り切れるプロセス : MPI_Send(); MPI_Recv(); それ以外 : MPI_Recv(); MPI_Send(); それぞれに対応 21

非同期通信 TIPS メッセージを完全に受け取ることなく 受信したメッセージの種類を確認したい 送信メッセージの種類により 受信方式を変えたい場合 MPI_Probe 関数 ( ブロッキング ) MPI_Iprobe 関数 ( ノンブロッキング ) MPI_Cancel 関数 ( ノンブロッキング ローカル ) 22

MPI_Probe 関数 ierr = MPI_Probe(isource, itag, icomm, istatus) ; isource: 整数型 送信元のランク MPI_ANY_SOURCE ( 整数型 ) も指定可能 itag: 整数型 タグ値 MPI_ANY_TAG ( 整数型 ) も指定可能 icomm: 整数型 コミュニケータ istatus: ステータスオブジェクト isource, itag に指定されたものがある場合のみ戻る 23

MPI_Iprobe 関数 ierr = MPI_Iprobe(isource, itag, icomm, iflag, istatus) ; isource: 整数型 送信元のランク MPI_ANY_SOURCE ( 整数型 ) も指定可能 itag: 整数型 タグ値 MPI_ANY_TAG ( 整数型 ) も指定可能 icomm: 整数型 コミュニケータ iflag: 論理型 isource, itag に指定されたものがあった場合は true を返す istatus: ステータスオブジェクト 24

MPI_Cancel 関数 ierr = MPI_Cancel(irequest); irequest: 整数型 通信要求 ( ハンドル ) 目的とする通信が実際に取り消される以前に 可能な限りすばやく戻る 取消しを選択するため MPI_Request_free 関数 MPI_Wait 関数 又は MPI_Test 関数 ( または任意の対応する操作 ) の呼出しを利用して完了されている必要がある 25

ノン ブロッキング通信例 (C 言語 ) if (myid == 0) { for (i=1; i<numprocs; i++) { ierr = MPI_Isend( &a[0], N, MPI_DOUBLE, i, i_loop, MPI_COMM_WORLD, &irequest[i] ); } } else { ierr = MPI_Recv( &a[0], N, MPI_DOUBLE, 0, i_loop, MPI_COMM_WORLD, &istatus ); } プロセス0は recvを a[ ] を使った計算処理 ; 待たず計算を開始 if (myid == 0) { for (i=1; i<numprocs; i++) { ierr = MPI_Wait(&irequest[i], &istatus); } } ランク 0 のプロセスは ランク 1~numprocs-1 までのプロセスに対して ノンブロッキング通信を用いて 長さ N の Double 型配列データを送信 ランク 1~numprocs-1 までのプロセスは ランク 0 からの受信待ち ランク 0 の PE は ランク 1~numprocs-1 までのプロセスに対するそれぞれの送信に対し それぞれが受信完了するまでビジーウェイト ( スピンウェイト ) する 26

ノン ブロッキング通信の例 (Fortran 言語 ) if (myid.eq. 0) then do i=1, numprocs - 1 call MPI_ISEND( a, N, MPI_DOUBLE_PRECISION, i, i_loop, MPI_COMM_WORLD, irequest, ierr ) enddo else call MPI_RECV( a, N, MPI_DOUBLE,_PRECISION, 0, i_loop, MPI_COMM_WORLD, istatus, ierr ) endif プロセス0は recvを a( ) を使った計算処理待たず計算を開始 if (myid.eq. 0) then do i=1, numprocs - 1 call MPI_WAIT(irequest(i), istatus, ierr ) enddo endif ランク 0 のプロセスは ランク 1~numprocs-1 までのプロセスに対して ノンブロッキング通信を用いて 長さ N の DOUBLE PRECISION 型配列データを送信 ランク 1~numprocs-1 までのプロセスは ランク 0 からの受信待ち ランク 0 のプロセスは ランク 1~numprocs-1 までのプロセスに対するそれぞれの送信に対し それぞれが受信完了するまでビジーウェイト ( スピンウェイト ) する 27

ノン ブロッキング通信による改善 プロセス 0 が必要なデータを持っている場合 連続する send における受信待ち時間をノン ブロッキング通信で削減 受信待ちを MPI_Wait で計算の後に行うように変更 プロセス 0 計算 send send send 計算 受信待 次の反復での同期待ち プロセス 1 計算 recv 計算 次の反復での同期待ち プロセス 2 計算 recv 計算 次の反復での同期待ち プロセス 3 計算 recv 計算 次の反復での同期点 28

永続的通信 ( その 1) ノン ブロッキング通信は MPI_ISENDの実装が MPI_ISENDを呼ばれた時点で本当に通信を開始する実装になっていないと意味がない ところが MPIの実装によっては MPI_WAITが呼ばれるまで MPI_ISENDの通信を開始しない実装がされていることがある この場合には ノン ブロッキング通信の効果が全くない 永続的通信 (Persistent Communication) を利用すると MPI ライブラリの実装に依存し ノン ブロッキング通信の効果が期待できる場合がある 永続的通信は MPI-1 からの仕様 ( たいていの MPI で使える ) しかし 通信と演算がオーバラップできる実装になっているかは別問題 29

永続的通信 ( その 2) 永続的通信の利用法 1. 通信を利用するループ等に入る前に 1 度 通信相手先を設定する初期化関数を呼ぶ 2. その後 SEND をする箇所に MPI_START 関数を書く 3. 真の同期ポイントに使う関数 (MPI_WAIT 等 ) は ISEND と同じものを使う MPI_SEND_INIT 関数で通信情報を設定しておくと MPI_START 時に通信情報の設定が行われない 同じ通信相手に何度でもデータを送る場合 通常のノン ブロッキング通信に対し 同等以上の性能が出ると期待 適用例 領域分割に基づく陽解法 陰解法のうち反復解法を使っている数値解法 30

永続的通信の実装例 (C 言語 ) MPI_Status istatus; MPI_Request irequest; if (myid == 0) { for (i=1; i<numprocs; i++) { ierr = MPI_Send_init (a, N, MPI_DOUBLE_PRECISION, i, 0, MPI_COMM_WORLD, irequest ); } } if (myid == 0) { for (i=1; i<numprocs; i++) { ierr = MPI_Start ( irequest ); } } /* 以降は Isend の例と同じ */ メインループに入る前に 送信データの相手先情報を初期化する ここで データを送る 31

永続的通信の実装例 (Fortran 言語 ) integer istatus(mpi_status_size) integer irequest(0:max_rank_size) if (myid.eq. 0) then do i=1, numprocs-1 call MPI_SEND_INIT (a, N, MPI_DOUBLE_PRECISION, i, 0, MPI_COMM_WORLD, irequest(i), ierr) enddo endif if (myid.eq. 0) then do i=1, numprocs-1 call MPI_START (irequest, ierr ) enddo endif /* 以降は ISEND の例と同じ */ メインループに入る前に 送信データの相手先情報を初期化する ここで データを送る 32

サンプルプログラムの実行 ( 非同期通信 ) はじめての MPI_Isend 33 スパコンプログラミング (1) (Ⅰ)

LU 分解のサンプルプログラムの注意点 C 言語版 /Fortran 言語版のファイル名 Isend-fx.tar ジョブスクリプトファイル isend.bash 中のキュー名を lecture から lecture4 に変更してから pjsub してください lecture : 実習時間外のキュー lecture4: 実習時間内のキュー 34 スパコンプログラミング (1) (Ⅰ)

MPI_Isend のサンプルプログラムの実行 (C 言語版 /Fortran 版共通 ) 以下のコマンドを実行する $ cp /home/z30082/isend-fx.tar./ $ tar xvf ISend-fx.tar $ cd Isend 以下のどちらかを実行 $ cd C : C 言語を使う人 $ cd F : Fortran 言語を使う人 以下共通 $ make $ pjsub isend.bash 実行が終了したら 以下を実行する $ cat isend.bash.oxxxxxx 35 スパコンプログラミング (1) (Ⅰ)

出力結果 以下のような結果が出力される (C 言語 ) Execution time using MPI_Isend : 30.3248 [sec.] 36 スパコンプログラミング (1) (Ⅰ)

サンプルプログラムの説明 (C 言語版 ) if (myid == 0) { for (i=1; i<numprocs; i++) { ierr = MPI_Isend( &a[0], N, MPI_DOUBLE, i, i_loop, MPI_COMM_WORLD, &irequest[i] ); } } else { ierr = MPI_Recv( &a[0], N, MPI_DOUBLE, 0, i_loop, MPI_COMM_WORLD, &istatus ); } if (myid == 0) { for (i=1; i<numprocs; i++) { ierr = MPI_Wait(&irequest[i], &istatus); } } ランク 0 の PE は ランク 1~191 までの PE に対して ノンブロッキング通信を用いて 長さ N の Double 型配列データを送信 ランク 1~191 までの PE は ランク 0 からの受信待ち ランク 0 の PE は ランク 1~191 までの PE に対するそれぞれの送信に対し それぞれが受信完了するまでビジーウェイト ( スピンウェイト ) する 37 スパコンプログラミング (1) (Ⅰ)

サンプルプログラムの説明 (Fortran 言語版 ) if (myid.eq. 0) then do i=1, numprocs - 1 call MPI_ISEND( a, N, MPI_DOUBLE_PRECISION, i, i_loop, MPI_COMM_WORLD, irequest, ierr ) enddo else call MPI_RECV( a, N, MPI_DOUBLE,_PRECISION, 0, i_loop, MPI_COMM_WORLD, istatus, ierr ) endif if (myid.eq. 0) then do i=1, numprocs - 1 call MPI_WAIT(irequest(i), istatus, ierr ) enddo endif ランク 0 の PE は ランク 1~191 までの PE に対して ノンブロッキング通信を用いて 長さ N の DOUBLE PRECISION 型配列データを送信 ランク 1~191 までの PE は ランク 0 からの受信待ち ランク 0 の PE は ランク 1~191 までの PE に対するそれぞれの送信に対し それぞれが受信完了するまでビジーウェイト ( スピンウェイト ) する 38 スパコンプログラミング (1) (Ⅰ)

レポート課題 ( その 1) 1. [L5] ブロッキングは同期でないことを説明せよ 2. [L10] MPIにおけるブロッキング ノンブロッキング および通信モードによる分類に対応する関数を調べ 一覧表にまとめよ 3. [L15] 利用できる並列計算機環境で ノンブロッキング送信 (MPI_Isend 関数 ) がブロッキング送信 (MPI_Send 関数 ) に対して有効となるメッセージの範囲 (N=0~ 適当な上限 ) について調べ 結果を考察せよ 4. [L20] MPI_Allreduce 関数の< 限定機能 > 版を ブロッキング送信 およびノンブロッキング送信を用いて実装せよ さらに その性能を比べてみよ なお < 限定機能 >は独自に設定してよい 39

レポート課題 ( その 2) 5. [L15] MPI_Reduce 関数を実現するRecursive Halving アルゴリズムについて その性能を調査せよ この際 従来手法も調べて その手法との比較も行うこと 6. [L35] Recursive Halvingアルゴリズムを ブロッキング送信 / 受信 および ノンブロッキング送信 / 受信を用いて実装せよ また それらの性能を評価せよ 7. [L15] 身近の並列計算機環境で 永続的通信関数の性能を調べよ 8. [L10~] 自分が持っているMPIプログラムに対し ノンブロッキング通信 (MPI_Isend, MPI_Irecv) を実装し 性能を評価せよ また永続的通信が使えるプログラムの場合は実装して評価せよ 40

発展話題 ( ソフトウエア自動チューニング ) 41