Microsoft PowerPoint _MPI-03.pptx

Similar documents
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])

untitled

演習準備

untitled

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

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

±é½¬£²¡§£Í£Ð£É½éÊâ

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

120802_MPI.ppt

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

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

コードのチューニング

並列計算導入.pptx

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

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

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

PowerPoint プレゼンテーション

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

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

MPI usage


86

目 目 用方 用 用 方


Sae x Sae x 1: 1. {x (i) 0 0 }N i=1 (x (i) 0 0 p(x 0) ) 2. = 1,, T a d (a) i (i = 1,, N) I, II I. v (i) II. x (i) 1 = f (x (i) 1 1, v(i) (b) i (i = 1,

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

gengo1-11

演習問題の構成 ディレクトリ構成 MPI/ --practice_1 演習問題 1 --practice_2 演習問題 2 --practice_3 演習問題 3 --practice_4 演習問題 4 --practice_5 演習問題 5 --practice_6 演習問題 6 --sample

openmp1_Yaguchi_version_170530

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

演習2

cp-7. 配列

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

Page 2 本資料は, 東北大学サイバーサイエンスセンターと NEC の共同により作成され, 大阪大学サイバーメディアセンターの環境で実行確認を行い, 修正を加えたものです. 無断転載等は, ご遠慮下さい.

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

演習1: 演習準備

nakao

¥Ñ¥Ã¥±¡¼¥¸ Rhpc ¤Î¾õ¶·

PowerPoint プレゼンテーション

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

PowerPoint プレゼンテーション

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

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£²¡Ë

GeoFEM開発の経験から

TFTP serverの実装

memo

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

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

02: 変数と標準入出力

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

MPI によるプログラミング概要 Fortran 編 中島研吾 東京大学情報基盤センター

プログラミングI第10回

Microsoft PowerPoint - ad11-09.pptx

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

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

C#の基本2 ~プログラムの制御構造~

Microsoft PowerPoint 並列アルゴリズム04.ppt

Transcription:

計算科学演習 Ⅰ ( 第 11 回 ) MPI を いた並列計算 (III) 神戸大学大学院システム情報学研究科横川三津夫 yokokawa@port.kobe-u.ac.jp 2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 1

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 2 今週の講義の概要 1. 前回課題の解説 2. 部分配列とローカルインデックス 3. ブロッキング関数とデッドロック mpi_sendrecv mpi_isend,mpi_irecv,mpi_wait 4. ノンブロッキング関数の応用

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 3 演習 9-2: ベクトルの正規化 再掲 n 次元ベクトル の第 要素を とする ( ). このとき, を正規化したベクトル を求めるプログラムを作成せよ. は の各要素の 2 乗和の平方根である. ベクトルは, ブロック分割で各プロセスに配置する. 各プロセスの担当する要素 (nprocs は MPI プロセス数 ) istart = (n/nprocs)*myrank + 1 iend = (n/nprocs)*(myrank+1) ベクトルの格納方法 プロセス 0 プロセス 1 プロセス 2 プロセス 3 各プロセスは長さ n の配列を持ち, そのうち自分の担当部分のみを使うプロセス0 プロセス0では, ここの部分が使われない

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 4 解答例 program dnorm2 use mpi implicit none integer, parameter :: n=1000 integer :: i,istart,iend integer, parameter :: SP = kind(1.0) integer, parameter :: DP = selected_real_kind(2*precision(1.0_sp)) real(dp) :: sum_local, sum, error_local, error, const real(dp) :: x(n) integer :: nprocs,myrank,ierr call mpi_init( ierr ) call mpi_comm_size( MPI_COMM_WORLD, nprocs, ierr ) call mpi_comm_rank( MPI_COMM_WORLD, myrank, ierr ) istart = (n/nprocs)*myrank + 1 配列 x(n) の宣言 iend = (n/nprocs)*(myrank+1) sum_local = 0.0d0 do i = istart, iend x(i) = dble(i) sum_local = sum_local + x(i)*x(i) call mpi_allreduce( sum_local, sum, 1, MPI_REAL8, MPI_SUM, MPI_COMM_WORLD, ierr ) const = 1.0d0/sqrt(dble(n*(n+1)*(2*n+1))/6.0d0) sum = 1.0d0/sqrt(sum) error_local = 0.0d0 do i = istart, iend x(i) = x(i)*sum error_local = error_local + abs( x(i) i*const ) call mpi_reduce( error_local, error, 1, MPI_REAL8, MPI_SUM, 0, MPI_COMM_WORLD, ierr ) if( myrank == 0 ) write(6,*) "Error = ", error call mpi_finalize(ierr) stop end program 配列 x のうち, 自分の担当する部分の要素をセット要素の 2 乗の部分和を計算 部分和の合計の平方根の逆数 自分の担当する要素を正規化する

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 5 解答に対するコメント mpi_allreduce() を使い, すべてのプロセスにおいて, ベクトルの大きさを持つことがポイント. 真の値との差を求めるのに,i/sqrt(sum) との差を計算していた. i/sqrt(sum) i/sqrt(real(n*(n+1)*(2*n+1)/6)) たまたま としたので, これでも良いが, ベクトルの正規化を問題にしており, ベクトル はいつも決まって値ではないので, 配列としてプログラムを作って欲しかった. x(i)/sqrt(sum) i/sqrt(real(n*(n+1)*(2*n+1)/6)) プログラムが正しいかどうかは, 今回のケースでは ので, 真値との差が0.0であることを確認する. が計算できる

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 6 演習 9-4:M-5(mv_s.f90) を並列化せよ 再掲 プログラム書き換えの方針 MPI の定義, 初期化, 終了処理を忘れないこと. 各プロセスの計算範囲を求める istart = (n/nprocs)*myrank + 1 iend = (n/nprocs)*(myrank+1), について, 各プロセスが担当する部分のみ初期化する. : 第 istart 列 ~ 第 iend 列 : 第 istart 要素 ~ 第 iend 要素 部分和ベクトルは, 各プロセスの持つ要素のみを使って計算部分和ベクトルは, 別の配列 ( 例えば y_tmp) を用いる. 部分和ベクトルの合計 mpi_reduce 関数により, ランク 0 のプロセスで, 配列 y_tmp の合計を配列 y に入れる. mpi_reduce 関数の第 3 引数 (count) に注意 ( 前回資料 29 ページ ) 結果は,

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 7 演習 9-4: 続き 再掲 n=1000 として, プロセス数 1,2,4, 及び 8 と変化させて実行させ, 結果が正しいことを確認せよ. そのときの計算時間の変化を調べよ. 初期設定, 結果の確認部分は, 計測範囲に含めないこと. プロセス数 (n), 計算時間 (Tn), 加速率 (Sn=T1/Tn) をまとめる. n Tn Sn 1 xxxxxxx 1.000 2 xxxxxxx xxxxxxx 4 xxxxxxx xxxxxxx 8 xxxxxxx xxxxxxx

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 8 解答例 :MPI プログラム M-6 program mv use mpi implicit none integer, parameter :: n=1000 integer :: i, j, istart, iend integer, parameter :: SP = kind(1.0) integer, parameter :: DP = selected_real_kind(2*precision(1.0_sp)) real(dp), dimension(n,n) :: a real(dp), dimension(n) :: x, y, yp real(dp) :: ans, err 自プロセスの範囲を表わす変数の定義 部分和を格納する変数の定義 integer :: nprocs, myrank, ierr call mpi_init( ierr ) call mpi_comm_size( MPI_COMM_WORLD, nprocs, ierr ) call mpi_comm_rank( MPI_COMM_WORLD, myrank, ierr ) ( 次ページに続く )

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 9 解答例 ( 続き ) istart = (n/nprocs)*myrank + 1 自プロセスの担当する範囲を計算 iend = (n/nprocs)*(myrank+1) do j = istart, iend A, x のうち, 自プロセスの担当する範囲のみを初期化 x(j) = j do i = 1, n do j = istart, iend a(i,j) = dble(i+j) do i = 1, n 部分和ベクトル yp の計算 yp(i) = 0.0d0 do j = istart, iend yp(i) = yp(i) + a(i,j)*x(j) call mpi_reduce(yp, y, n, MPI_REAL8, MPI_SUM, 0, MPI_COMM_WORLD, ierr) yp を合計して y を得る if( myrank == 0 ) then err = 0.0d0 do i = 1, n プロセス0で結果をチェック ans = dble(i*n*(n+1)/2+n*(n+1)*(2*n+1)/6) err = err + abs( y(i) ans ) print *, 'error =', err end if call mpi_finalize(ierr) end program mv

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 10 解答に対するコメント 初期設定, 結果の確認部分は, 計測範囲に含めないこと と書いてあったが, 初期設定, 結果の確認部分 も計測範囲に含めていたものが多かった. Sn=T1/Tn の式の意味を間違えていた. 4 プロセスで 4 倍以上,8 プロセスで 8 倍以上の性能向上があったものについては, 考察が欲しいところ.

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 11 プログラムの問題点 : メモリの無駄 istart = (n/nprocs)*myrank + 1 自プロセスの担当する範囲を計算 iend = (n/nprocs)*(myrank+1) do j = istart, iend x(j) = j do i = 1, n do j = istart, iend a(i,j) = dble(i+j) do i = 1, n 部分和ベクトル yp の計算 yp(i) = 0.0d0 do j = istart, iend yp(i) = yp(i) + a(i,j)*x(j) call mpi_reduce(yp, y, n, MPI_REAL8, MPI_SUM, 0, MPI_COMM_WORLD, ierr) if( myrank == 0 ) then err = 0.0d0 do i = 1, n ans = dble(i*n*(n+1)/2+n*(n+1)*(2*n+1)/6) err = err + abs( y(i) ans ) print *, 'error =', err end if call mpi_finalize(ierr) end program mv A, x のうち, 自プロセスの担当する範囲のみを初期化 例えば,rank=2 では, ピンクの部分だけしか使っていないので, メモリがもったいない. プロセス 0 で結果をチェック yp を合計して y を得る

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 12 部分配列とローカルインデックス 部分配列の利用 プログラム M-6 では, 各プロセスが, 全体を格納できる配列を確保し, そのうち自分の担当部分のみに値を入れて使用している. 実際に使用する範囲のみを確保すれば, メモリを節約できる. : 第 istart 列 ~ 第 iend 列 : 第 istart 要素 ~ 第 iend 要素 これを実現するには,allocatable 配列を利用すればよい ローカルインデックス Fortran では,allocate 文により, のインデックスを istart から始まるようにできる. C 言語の malloc() と, メモリの動的確保という点では, 同等の関数 これにより, プログラムをほとんど変えずに部分配列を利用可能 サイクリック分割等の場合は, やや複雑なインデックス変換が必要

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 13 演習 10-1: 部分配列とローカルインデックス allocate 文を使って, メモリを節約するように M-6 を書き換え, 実行し, 結果を確認せよ.

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 14 演習 10-1:allocate 文を使う. program mv_alloc use mpi implicit none integer, parameter :: n=1000 integer :: i, j, istart, iend integer, parameter :: SP = kind(1.0) integer, parameter :: DP = selected_real_kind(2*precision(1.0_sp)) real(dp), dimension(:,:), allocatable :: a real(dp), dimension(:), allocatable :: x real(dp), dimension(n) :: y, yp real(dp) :: ans, err A,x を不定サイズの配列として定義 integer :: nprocs, myrank, ierr call mpi_init( ierr ) call mpi_comm_size( MPI_COMM_WORLD, nprocs, ierr ) call mpi_comm_rank( MPI_COMM_WORLD, myrank, ierr ) istart = (n/nprocs)*myrank + 1 iend = (n/nprocs)*(myrank+1) allocate( a(n,istart:iend) ) allocate( x(istart:iend) ) A,x の領域を確保 ( 次ページに続く )

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 15 解答例 ( 続き ) do j = istart, iend x(j) = j do i = 1, n do j = istart, iend a(i,j) = dble(i+j) do i = 1, n yp(i) = 0.0d0 do j = istart, iend yp(i) = yp(i) + a(i,j)*x(j) call mpi_reduce( yp, y, n, MPI_REAL8, MPI_SUM, 0, MPI_COMM_WORLD, ierr ) if( myrank == 0 ) then err = 0.0d0 do i = 1, n ans = dble(i*n*(n+1)/2+n*(n+1)*(2*n+1)/6) err = err + abs( y(i) ans ) print *, 'error =', err end if deallocate( a, x ) A,x の領域を開放 call mpi_finalize(ierr) end program mv_alloc A の列番号,x の要素番号が istart から始まるようにしたので, この部分は変えなくてよい

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 16 MPI プログラム M-7 : デッドロック program deadlock use mpi implicit none integer, parameter :: n=10 double precision :: a0(n), a1(n) integer :: nprocs, myrank, ierr integer :: istat(mpi_status_size) call mpi_init( ierr ) call mpi_comm_size( MPI_COMM_WORLD, nprocs, ierr ) call mpi_comm_rank( MPI_COMM_WORLD, myrank, ierr ) if( myrank == 0 ) then a0 = 1.0 else a1 = 2.0 endif if( myrank == 0 ) then call mpi_send( a0, n, MPI_REAL8, 1, 100, MPI_COMM_WORLD, ierr ) call mpi_recv( a1, n, MPI_REAL8, 1, 200, MPI_COMM_WORLD, istat, ierr ) else call mpi_send( a1, n, MPI_REAL8, 0, 200, MPI_COMM_WORLD, ierr ) call mpi_recv( a0, n, MPI_REAL8, 0, 100, MPI_COMM_WORLD, istat, ierr ) end if call mpi_finalize( ierr ) end program deadlock

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 17 演習 10-2 デッドロックを確認せよ プログラム M-7 をコピーし, 以下のことを確認せよ. /tmp/cpmpi/m-7/deadlock.f90 プログラム 5 行目の n を,10, 100 としたときに, 結果がどうなるか確認せよ. プロセス数は 2 として実行する. 注意 ) ジョブスクリプトの #PJM L elapse=00:00:xx の xx は大きくしない. M-7 において,send, recv の順番を次のように変えて実行し, 結果がどなるか確認せよ. 変更 1 if( myrank == 0 ) then call mpi_recv( ) call mpi_send( ) else call mpi_recv( ) call mpi_send( ) end if 変更 2 if( myrank == 0 ) then call mpi_send( ) call mpi_recv( ) else call mpi_recv( ) call mpi_send( ) end if

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 18 実行結果は... 次のシステム メッセージが出るケースがある. jwe0017i u The program was terminated with signal number SIGXCPU. CPU の時間制限を越えた. ジョブが指定した時間内に終わらなかった. ジョブが終了するケースと, そうでないケースがある. 何故か?

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 19 ブロッキング関数とデッドロック mpi_send(),mpi_recv() はブロッキング関数 ブロッキング関数の動作 ( 実装による ) 送信 / 受信側のバッファ領域にメッセージが格納され, 受信 / 送信側のバッファ領域が自由にアクセス ( 上書き ) できるまで, 呼出し元に制御が戻らない. mpi_send の場合, すべてのメッセージが MPI 送信バッファに書き込みが終わった段階で, 呼出し元に制御が戻る場合もある ( 後は, 下位レイヤの通信プログラムに制御を任せてしまう ). mpi_recv は, すべてのメッセージを受信するまで, 呼出し元に制御が戻らない. 次の行に制御が移らない. ブロッキング関数は, その関数の処理が終了するまで, 次の処理に進まない.

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 20 演習 10-2 の解説 ケース 1:send-recv : send-recv かつ n=10 mpi_send で送るメッセージのバイト数が小さいため, システムのバッファにすべて書き込めたので, 制御が戻り, 次の行が実行された, と考えられる. mpi ライブラリの実装に依る. ケース 2: send-recv : send-recv かつ n=100 mpi_send で送るメッセージのバイト数が大きく, すべてのメッセージが MPI 通信バッファに書き込めず, 相手の recv の開始を待っているが, 相手も mpi_send を実行していて, 受取ってくれないので,deadlock となった. ケース 3: recv-send: recv-send どちらのプロセスも mpi_recv 関数を実行し, データの到着を待っているが, お互い mpi_send が実行できないので, そこで待っている間に CPU の制限時間に達した. ケース 4: send-recv: recv-send 送受信の順番が, シリアライズされたため, 上手く実行できた.

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 21 デッドロックの回避方法 0 1 1 送受信の順序のシリアライズ ( ケース 4) プロセス0: プロセス1: 送信してから受信受信してから送信 send recv recv send 2 mpi_sendrecv の利用 mpi_send と mpi_recv をまとめて行うルーチンデッドロックは生じない 1 回の送受信の時間で済む送信相手と受信相手が異なってもよい 0 1 sendrecv sendrecv 3 ノンブロッキング関数の利用 mpi_isend mpi_irecv ノンブロッキング関数では, 制御が呼出し元にすぐに戻るので, 転送する変数に関係ない他の作業をすることが出来る. 特に, 通信と計算が同時に動作する mpi_wait で, 関数の終了を確認する必要がある. 0 1 irecv recv send send wait

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 22 双方向通信 :mpi_sendrecv 関数 mpi_sendrecv( sendbuff, sendcount, sendtype, dest, sendtag, recvbuff, recvcount, recvtype, source, recvtag, comm, status, ierr ) sendbuff: 送信するデータのための変数名 ( 先頭アドレス ) sendcount: 送信するデータの数 ( 整数型 ) sendtype: 送信するデータの型 (MPI_REAL,MPI_INTEGERなど) dest: 送信する相手プロセスのランク番号 sendtag recvbuff: 受信するデータのための変数名 ( 先頭アドレス ) recvcount: 受信するデータの数 ( 整数型 ) recvtype: 受信するデータの型 (MPI_REAL,MPI_INTEGERなど) source: 送信してくる相手プロセスのランク番号 tag: メッセージ識別番号. 送られて来たデータを区別するための番号 comm: コミュニケータ ( 例えば,MPI_COMM_WORLD) status: 受信の状態を格納するサイズMPI_STATUS_SIZEの配列 ( 整数型 ) ierr: 戻りコード ( 整数型 )

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 23 ノンブロッキング送信関数 mpi_isend mpi_isend( buff, count, datatype, dest, tag, comm, request, ierr ) ランク番号 dest のプロセスに, 変数 buff の値を送信する. buff: 送信するデータの変数名 ( 先頭アドレス ) count: 送信するデータの数 ( 整数型 ) datatype: 送信するデータの型 MPI_INTEGER, MPI_REAL, MPI_DOUBLE_PRECISIONなど dest: 送信先プロセスのランク番号 tag: comm: メッセージ識別番号. 送るデータを区別するための番号 コミュニケータ ( 例えば,MPI_COMM_WORLD) request: リクエスト識別番号 ( 整数型 ) ierr: 戻りコード ( 整数型 )

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 24 ノンブロッキング受信関数 mpi_irecv mpi_irecv( buff, count, datatype, source, tag, comm, request, ierr ) ランク番号 sourceのプロセスから送られたデータを, 変数 buffに格納する. buff: 受信するデータのための変数名 ( 先頭アドレス ) count: 受信するデータの数 ( 整数型 ) datatype: 受信するデータの型 MPI_INTEGER, MPI_REAL, MPI_DOUBLE_PRECISIONなど source: 送信してくる相手プロセスのランク番号 tag: comm: メッセージ識別番号. 送られて来たデータを区別するための番号 コミュニケータ ( 例えば,MPI_COMM_WORLD) request: リクエスト識別変数 ( 整数型 ) ierr: 戻りコード ( 整数型 )

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 25 待ちの関数 mpi_wait mpi_wait( request, status, ierr ) リクエスト識別変数 request に対応した通信関数の終了を確認する. ブロッキング関数 request: リクエスト識別変数 ( 整数型 ) 対応する mpi_isend, または mpi_irecv のリクエスト識別番号と一致させる status: 受信の状態を格納するサイズ MPI_STATUS_SIZE の配列 ( 整数型 ) ierr: 戻りコード ( 整数型 )

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 26 演習 10-3 プログラム M-7 を, 次の 2 つの方法で,deadlock しないプログラムにせよ. mpi_irecv, mpi_wait を使う. 21 ページの 3 のとおり. mpi_sendrecv を使う. プロセス 0, プロセス 1 は, それぞれ送る変数が違うことに注意. データがきちんと転送されていることを確認すること.

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 27 演習 10-4: ノンブロッキング関数の応用 問題行列 - ベクトル積において, たまたま行列, ベクトル が, 最初, プロセス 0 にしかない場合を考える. すべてのプロセスで, を計算させる. この場合,, を他のプロセスに転送し計算しなければならない. プログラム M-8(mv_time.f90) をコピーし, 中身を読んで, プログラムの動きを想像した後, プロセス数 8 で M-8 を実行しなさい. 計算時間の計測結果をみて, 実際のプログラムの動きを考えよ. /tmp/cpmpi/m-8/mv_time.f90 プログラムは, ブロッキング関数で書いてある.

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 28 並列プログラム M-8 の動作 ブロッキング関数による動作 barrier barrier プロセス0 計算 send send send send 行列ベクトル積 プロセス 1 計算 recv 行列ベクトル積 他のプロセスの終了待ち プロセス 2 計算 recv 行列ベクトル積 他のプロセスの終了待ち プロセス 3 計算 recv 行列ベクトル積 他のプロセスの終了待ち

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 29 演習 10-5: プログラム M-8 の改良 提出課題 プログラム M-8 を, ノンブロッキング関数を用いて, 全体の計算時間を短縮せよ. プログラミングのポイントノンブロッキング関数を使う. リクエスト識別番号は, 実行した関数を識別するためのものだから, 呼出し毎に違った値を返す. ノンブロッキング関数の終了は, プログラムの適切な場所で確認する.

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 30 演習 10-6 任意課題 プログラム M-8 は, 行列, ベクトルの全体を, 他のプロセスに配り, すべてを計算していた. 行列, ベクトルをプロセスに均等に分配し, 結果をプロセス 0 に集めてくるように,M-8 を改良せよ. 結果を確認すること. プロセス数を 1,2,4,8 と変えて実行し, 計算時間について考察せよ.

2014/07/03 計算科学演習 Ⅰ:MPI を用いた並列計算 (III) 31 課題の提出方法と提出期限 1 演習 10-5( 必須 ), 演習 10-6( 任意 ) の提出方法 それぞれプログラムと実行結果を一つのファイルにまとめる.2 つに分けてメールすること. $ cat program.f90 > report10 5.txt $ cat xxxxx.onnnnn >> report10 5.txt 2 以下の方法で, メールにより提出 $ cat report10 5.txt mail s 10 5: アカウント yokokawa@port.kobe u.ac.jp Note) アカウントは 分のログイン ID 番号 (10 5) は, 演習番号 期限 :7 月 8 日 ( 火 ) 午後 5 時 Wiki ページのアンケート (7/3) への協力をお願いします.