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

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

untitled

Microsoft PowerPoint - KHPCSS pptx

PowerPoint プレゼンテーション

演習準備

Microsoft PowerPoint _MPI-01.pptx

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

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

コードのチューニング

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

Microsoft PowerPoint _MPI-03.pptx

並列計算導入.pptx

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

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

120802_MPI.ppt

NUMAの構成

untitled

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

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

Total View Debugger 利用の手引 東京工業大学学術国際情報センター version 1.0

H28 年度 SX-ACE 高速化技法の基礎 ( 演習用資料 ) 2016 年 6 月 16 日大阪大学サイバーメディアセンター日本電気株式会社

コードのチューニング

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

演習1: 演習準備

コードのチューニング

Microsoft Word - 計算科学演習第1回3.doc

(Basic Theory of Information Processing) Fortran Fortan Fortan Fortan 1

MPI usage

2 /83

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

スライド 1

スライド 1

about MPI

Fujitsu Standard Tool

PowerPoint プレゼンテーション

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

演習1

2012年度HPCサマーセミナー_多田野.pptx

サイバーメディアセンター 大規模計算機システムの利用

目次 LS-DYNA 利用の手引き 1 1. はじめに 利用できるバージョン 概要 1 2. TSUBAME での利用方法 使用可能な LS-DYNA の実行 4 (1) TSUBAMEにログイン 4 (2) バージョンの切り替え 4 (3) インタラ

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

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

memo

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

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

nakao

Microsoft PowerPoint - 講義10改.pptx

openmp1_Yaguchi_version_170530

040312研究会HPC2500.ppt

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

2 2.1 Mac OS CPU Mac OS tar zxf zpares_0.9.6.tar.gz cd zpares_0.9.6 Mac Makefile Mekefile.inc cp Makefile.inc/make.inc.gfortran.seq.macosx make

memo

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

untitled

演習2

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

Reedbush-Uアカウントの発行

Microsoft Word - appli_SMASH_tutorial_2.docx

cp-7. 配列

3. :, c, ν. 4. Burgers : u t + c u x = ν 2 u x 2, (3), ν. 5. : u t + u u x = ν 2 u x 2, (4), c. 2 u t 2 = c2 2 u x 2, (5) (1) (4), (1 Navier Stokes,.,

memo

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

スクールCOBOL2002

3. :, c, ν. 4. Burgers : t + c x = ν 2 u x 2, (3), ν. 5. : t + u x = ν 2 u x 2, (4), c. 2 u t 2 = c2 2 u x 2, (5) (1) (4), (1 Navier Stokes,., ν. t +

Microsoft Word _001b_hecmw_PC_cluster_201_howtodevelop.doc

プログラミングI (手続き)

Fortran90/95 2. (p 74) f g h x y z f x h x = f x + g x h y = f y + g y h z = f z + g z f x f y f y f h = f + g Fortran 1 3 a b c c(1) = a(1) + b(1) c(

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

スライド 1

H26 年度 スーパーコンピュータの高速化技法入門 演習用資料 2015 年 1 月 21 日大阪大学サイバーメディアセンター 日本電気株式会社

並列計算プログラミング超入門

GeoFEM開発の経験から

11042 計算機言語7回目 サポートページ:

サイバーメディアセンター 大規模計算機システムの利用

gengo1-8

OpenMPプログラミング

第9回 配列(array)型の変数

ポインタ変数

Microsoft PowerPoint ppt

FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作り

インテル(R) Visual Fortran Composer XE 2013 Windows版 入門ガイド

Microsoft Word - 資料 docx

Microsoft PowerPoint - 計算機言語 第7回.ppt

Microsoft PowerPoint - 03_What is OpenMP 4.0 other_Jan18

Reedbush-Uアカウントの発行

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

2

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

PowerPoint プレゼンテーション

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

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

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

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

メソッドのまとめ

OpenMP (1) 1, 12 1 UNIX (FUJITSU GP7000F model 900), 13 1 (COMPAQ GS320) FUJITSU VPP5000/64 1 (a) (b) 1: ( 1(a))

( ) 1 Windows HTML ( ) ( ) ( ) WWW 10 ( )

ポインタ変数

情報活用資料

Transcription:

SX-ACE 並列プログラミング入門 (MPI) ( 演習補足資料 ) 大阪大学サイバーメディアセンター日本電気株式会社

演習問題の構成 ディレクトリ構成 MPI/ -- practice_1 演習問題 1 -- practice_2 演習問題 2 -- practice_3 演習問題 3 -- practice_4 演習問題 4 -- practice_5 演習問題 5 -- practice_6 演習問題 6 -- sample テキスト内のsampleX.fとして掲載しているプログラム -- etc その他, テキスト内のetcX.fとして掲載しているプログラム Page 2

3. 演習問題 1-1 (practice_1) P16のプログラム (sample2.f) をpractice1.f としてコピーし, コンパイル 実行してください ファイルのコピー % cd MPI/practice_1 % cp../sample/sample2.f practice1.f コンパイル方法 % sxmpif90 practice1.f Page 3

3. 演習問題 1-1 (practice_1) つづき 実行スクリプトの確認 % cat run.sh #!/bin/csh #PBS -q ACE #PBS -l cpunum_job=4,memsz_job=60gb,elapstim_req=0:05:00 #PBS -T mpisx #PBS -b 1 setenv MPIPROGINF DETAIL cd $PBS_O_WORKDIR mpirun -np 4./a.out ジョブの投入 ( 実行 ) % qsub run.sh 実行結果の確認 % cat p1-practice.oxxxx (XXXX はシステムにより付与されるジョブ ID) Page 4

3. 演習問題 1-2 (practice_1) 演習問題 1-1で使ったMPIプログラム Hello World の結果をランク0のみが出力するように書き換えてください ファイルのコピー % cp practice1.f practice1-2.f プログラムの編集 % vi practice1-2.f コンパイル % sxmpif90 practice1-2.f 実行 % qsub run.sh Page 5

4. 演習問題 2 (practice_2) MPIプログラミング入門テキスト P19の1から1000の総和を求める逐次プログラムを4 分割してMPI 並列で実行し, 各部分和を各ランクから出力してください. ヒント : プログラムの流れは下記のとおり MPI の初期化処理 プロセス数と自プロセスのランク番号の取得 分割時の始点と終点を求める 部分和に初期値 (=0) を与える部分和を求めるループの実行 部分和の出力 MPI の終了化処理 Page 6

4. 演習問題 2 (practice_2) つづき ディレクトリの移動 % cd MPI/practice_2 プログラムの編集逐次プログラムはディレクトリ practice_2/ にあります. % vi practice2.f コンパイル % sxmpif90 practice2.f 実行 % qsub run.sh Page 7

5. 演習問題 3 (practice_3) 演習問題 2のプログラムの各ランクの部分和をランク0に集めて, 総和を計算し出力してください ヒント : 転送処理は以下 ランク 1,2,3(0 以外 ) call MPI_SEND(isum,1,MPI_INTEGER,0, & itag,mpi_comm_world,ierr) ランク 0 call MPI_RECV(isum2,1,MPI_INTEGER,1, & itag,mpi_comm_world,status,ierr) call MPI_RECV(isum2,1,MPI_INTEGER,2, & itag,mpi_comm_world,status,ierr) call MPI_RECV(isum2,1,MPI_INTEGER,3, & itag,mpi_comm_world,status,ierr) isum で受信するとランク 0 の部分和が上書きされてしまう Page 8

5. 演習問題 3 (practice_3) つづき ディレクトリの移動 % cd MPI/practice_3 プログラムの編集演習問題 2の回答例を practice3.f として用意しています % vi practice3.f コンパイル % sxmpif90 practice3.f 実行 % qsub run.sh Page 9

6. 演習問題 4 (practice_4) 演習問題 3 のプログラムで 各ランクの部分和を MPI_REDUCE を使用してランク 0 に集計して ランク 0 から結果を出力してください ディレクトリの移動 % cd MPI/practice_4 プログラムの編集演習問題 3の回答例を practice4.f として用意しています % vi practice4.f コンパイル % sxmpif90 practice4.f 実行 % qsub run.sh Page 10

8. 演習問題 5 (practice_5) P59 の etc4.f を P57 の 代表プロセス入力 + メモリ削減 の例のように, 各プロセスに必要な領域だけ確保するように修正してください. ヒント : 1 2 3 4 senddata,recvdataを動的に確保するようにallocatable 宣言する各プロセスが確保する領域 (ist,ied) を求める各プロセスで必要なsenddataの領域を確保する (allocate) ランク0でrecvdataの領域を確保する (allocate) Page 11

8. 演習問題 5 (practice_5) つづき ディレクトリの移動 % cd MPI/practice_5 プログラムの編集 practice5.f を用意しています % vi practice5.f コンパイル % sxmpif90 practice5.f 実行 % qsub run.sh Page 12

9. 演習問題 6(practice_6) 行列積プログラムを MPI で並列化してください implicit real(8)(a-h,o-z) parameter ( n=12000 ) real(8) a(n,n),b(n,n),c(n,n) real(4) etime,cp1(2),cp2(2),t1,t2,t3 do j = 1,n do i = 1,n a(i,j) = 0.0d0 b(i,j) = n+1-max(i,j) c(i,j) = n+1-max(i,j) enddo enddo write(6,50) ' Matrix Size = ',n 50 format(1x,a,i5) t1=etime(cp1) do j=1,n do k=1,n do i=1,n a(i,j)=a(i,j)+b(i,k)*c(k,j) end do end do end do t2=etime(cp2) t3=cp2(1)-cp1(1) write(6,60) ' Execution Time = ',t2,' sec',' A(n,n) = ',a(n,n) 60 format(1x,a,f10.3,a,1x,a,d24.15) stop end 左記に行列積を行うプログラムを MPI 化して 4 プロセスで実行してください. 出力はプロセス 0 で行ってください. Page 13

9. 演習問題 6(practice_6) つづき ヒント : プログラムの流れは下記のとおり MPI の初期化処理 プロセス数と自プロセスのランク番号の取得 分割時の始点と終点を求める 解を格納する配列 a の初期化行列 b と c の値の設定 各プロセスが担当する範囲の行列積を計算 解を格納する配列 a をランク 0 に集める 時間計測は MPI_Wtime を使用する 1 時間を格納する変数は real*8 で定義する real*8 t1,t2 2 測定する区間の始まりと終わりの時間を計測する call MPI_BARRIER(MPI_COMM_WORLD,IERR) t1=mpi_wtime() [ 測定区間 ] call MPI_BARRIER(MPI_COMM_WORLD,IERR) t2=mpi_wtime() 3t2-t1 が計測区間の時間となる ランク 0 が結果を出力 MPI の終了化処理 Page 14

9. 演習問題 6(practice_6) つづき データの転送方法 ( 行列 - ベクトル積 ) プロセス 0 はプロセス 1,2,3 から計算結果を格納した配列 x を受け取る ( 下図 ) プロセス 0 プロセス 1 プロセス 2 プロセス 3 MPI_GATHER を使用して 各ランクに分散したデータを集める詳細は付録 1.3.8 Page 15

9. 演習問題 6(practice_6) つづき ディレクトリの移動 % cd MPI/practice_6 プログラムの編集 MPIプログラム入門テキストP90のsample6.fをpractice6.fとして用意しています % vi practice6.f コンパイル % sxmpif90 practice6.f 実行 % qsub run.sh Page 16

演習問題解答例 Page 17

3. 演習問題 1-2 (practice_1) 解答例 program example1 include 'mpif.h' integer ierr,myrank call MPI_INIT(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD,myrank,ierr) if(myrank.eq.0) print *,"Hello World",myrank call MPI_FINALIZE(ierr) stop end % sxmpif90 practice1.f % qsub run.sh % cat p1-practice.oxxxx Hello World 0 Page 18

4. 演習問題 2 (practice_2) 解答例 Page 19 program example2 include 'mpif.h' integer ierr,myrank,nprocs,ist,ied parameter(n=1000) integer isum call MPI_INIT(ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD,nprocs,ierr) call MPI_COMM_RANK(MPI_COMM_WORLD,myrank,ierr) ist=((n-1)/nprocs+1)* myrank+1 ied=((n-1)/nprocs+1)*(myrank+1) isum=0 do i=ist,ied isum=isum+i enddo write(6,6000) myrank,isum 6000 format("total of Rank:",i2,i10) call MPI_FINALIZE(ierr) stop end % sxmpif90 practice2.f % qsub run.sh % cat p2-practice.oxxxx Total of Rank: 0 31375 Total of Rank: 2 156375 Total of Rank: 3 218875 Total of Rank: 1 93875

5. 演習問題 3 (practice_3) 解答例 program example3 include 'mpif.h' integer ierr,myrank,nprocs,ist,ied integer status(mpi_status_size) parameter(n=1000) integer isum,isum2 call MPI_INIT(ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD,nprocs,ierr) call MPI_COMM_RANK(MPI_COMM_WORLD,myrank,ierr) ist=((n-1)/nprocs+1)*myrank+1 ied=((n-1)/nprocs+1)*(myrank+1) isum=0 do i=ist,ied isum=isum+i enddo Page 20

5. 演習問題 3 (practice_3) 解答例 ( つづき ) itag=1 if(myrank.ne.0) then call MPI_SEND(isum,1,MPI_INTEGER,0, & itag,mpi_comm_world,ierr) else call MPI_RECV(isum2,1,MPI_INTEGER,1, & itag,mpi_comm_world,status,ierr) isum=isum+isum2 call MPI_RECV(isum2,1,MPI_INTEGER,2, & itag,mpi_comm_world,status,ierr) isum=isum+isum2 call MPI_RECV(isum2,1,MPI_INTEGER,3, & itag,mpi_comm_world,status,ierr) isum=isum+isum2 write(6,6000) isum 6000 format("total Sum = ",i10) endif call MPI_FINALIZE(ierr) stop end % sxmpif90 practice3.f % qsub run.sh % cat p3-practice.oxxxx Total Sum = 500500 Page 21

6. 演習問題 4 (practice_4) 解答例 program example4 include 'mpif.h' integer ierr,myrank,nprocs,ist,ied parameter(n=1000) integer isum,isum2 call MPI_INIT(ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD,nprocs,ierr) call MPI_COMM_RANK(MPI_COMM_WORLD,myrank,ierr) ist=((n-1)/nprocs+1)*myrank+1 ied=((n-1)/nprocs+1)*(myrank+1) isum=0 do i=ist,ied isum=isum+i enddo Page 22

6. 演習問題 4 (practice_4) 解答例 ( つづき ) call MPI_REDUCE(isum,isum2,1,MPI_INTEGER,MPI_SUM,0, & MPI_COMM_WORLD,ierr) if(myrank.eq.0) write(6,6000) isum2 6000 format("total Sum = ",i10) call MPI_FINALIZE(ierr) stop end % sxmpif90 practice4.f % qsub run.sh % cat p4-practice.oxxxx Total Sum = 500500 MPI_REDUCE では送信するデータと受信するデータの領域に重なりがあってはならない.isum と isum2 に分けて使用. Page 23

8. 演習問題 5 (practice_5) 解答例 include 'mpif.h' integer,parameter :: numdat=100 integer,allocatable :: senddata(:),recvdata(:) call MPI_INIT(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD,myrank,ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD,nprocs,ierr) ist = ((numdat-1)/nprocs+1)*myrank+1 ied = ((numdat-1)/nprocs+1)*(myrank+1) allocate(senddata(ist:ied)) if(myrank.eq.0) allocate(recvdata(numdat)) icount=(numdat-1)/nprocs+1 do i=1,icount senddata(icount*myrank+i)=icount*myrank+i enddo Page 24

8. 演習問題 5 (practice_5) 解答例 ( つづき ) call MPI_GATHER(senddata(icount*myrank+1), & icount,mpi_integer,recvdata, & icount,mpi_integer,0,mpi_comm_world, & ierr) if(myrank.eq.0) then open(60,file='fort.60') write(60,'(10i8)') recvdata endif call MPI_FINALIZE(ierr) stop end % sxmpif90 practice5.f % qsub run.sh % cat fort.60 1 2 3 4 5 Page 25

9. 演習問題 6(practice_6) 解答例 program example6 implicit real(8)(a-h,o-z) include 'mpif.h' integer ierr,myrank,nprocs,ist,ied parameter ( n=12000 ) real(8) a(n,n),b(n,n),c(n,n) real(8) d(n,n) real(8) t1,t2 call MPI_INIT(ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD,nprocs,ierr) call MPI_COMM_RANK(MPI_COMM_WORLD,myrank,ierr) ist=((n-1)/nprocs+1)*myrank+1 ied=((n-1)/nprocs+1)*(myrank+1) n2=n/nprocs Page 26

9. 演習問題 6(practice_6) 解答例 ( つづき ) do j = 1,n do i = 1,n a(i,j) = 0.0d0 b(i,j) = n+1-max(i,j) c(i,j) = n+1-max(i,j) enddo enddo if(myrank.eq.0) then write(6,50) ' Matrix Size = ',n endif 50 format(1x,a,i5) Page 27

9. 演習問題 6(practice_6) 解答例 ( つづき ) Page 28 call MPI_BARRIER(MPI_COMM_WORLD,ierr) t1=mpi_wtime() do j=ist,ied do k=1,n do i=1,n a(i,j)=a(i,j)+b(i,k)*c(k,j) end do end do end do call MPI_GATHER(a(1,ist),n*n2,MPI_REAL8,d,n*n2 &,MPI_REAL8,0,MPI_COMM_WORLD, ierr) call MPI_BARRIER(MPI_COMM_WORLD,ierr) t2=mpi_wtime() if(myrank.eq.0) then write(6,60) ' Execution Time = ',t2-t1,' sec',' A(n,n) = ',d(n,n) endif 60 format(1x,a,f10.3,a,1x,a,d24.15) call MPI_FINALIZE(ierr) stop end % sxmpif90 practice6.f % qsub run.sh % cat p6-practice.oxxxx Matrix Size = 12000 Execution Time = 13.957 sec A(n,n) = 0.120000000000000D+05