演習1: 演習準備

Similar documents
演習準備

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

openmp1_Yaguchi_version_170530

FX10利用準備

コードのチューニング

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

Microsoft PowerPoint - OpenMP入門.pptx

NUMAの構成

Microsoft Word - openmp-txt.doc

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

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

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

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

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

I I / 47

PowerPoint プレゼンテーション

enshu5_4.key

(Microsoft PowerPoint \215u\213`4\201i\221\272\210\344\201j.pptx)

OpenMPプログラミング

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

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

Microsoft PowerPoint _MPI-01.pptx

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

演習1

コードのチューニング

ÊÂÎó·×»»¤È¤Ï/OpenMP¤Î½éÊâ¡Ê£±¡Ë

新スーパーコンピュータ 「ITOシステム」利用講習会

8 / 0 1 i++ i 1 i-- i C !!! C 2

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

enshu5_6.key

01_OpenMP_osx.indd

AICS 村井均 RIKEN AICS HPC Summer School /6/2013 1

2. OpenMP OpenMP OpenMP OpenMP #pragma#pragma omp #pragma omp parallel #pragma omp single #pragma omp master #pragma omp for #pragma omp critica

並列計算導入.pptx

Microsoft PowerPoint - 阪大CMSI pptx

Microsoft PowerPoint - 03_What is OpenMP 4.0 other_Jan18

PowerPoint プレゼンテーション

Microsoft PowerPoint - KHPCSS pptx

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

並列プログラミング入門(OpenMP編)

この時お使いの端末の.ssh ディレクトリ配下にある known_hosts ファイルから fx.cc.nagoya-u.ac.jp に関する行を削除して再度ログインを行って下さい

02_C-C++_osx.indd

プログラミング基礎

PowerPoint プレゼンテーション

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

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

I

スライド 1

Microsoft PowerPoint - 阪大CMSI pptx

about MPI

sim98-8.dvi

ゲームエンジンの構成要素

 

C

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

生物情報実験法 (オンライン, 4/20)

Oakforest-PACS 利用の手引き 2 ノートパソコンの設定 : 公開鍵の生成 登録

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

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

PowerPoint Presentation

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

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

演習2

プログラミング基礎

C C UNIX C ( ) 4 1 HTML 1

Microsoft PowerPoint - 説明2_演算と型(C_guide2)【2015新教材対応確認済み】.pptx

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

1 return main() { main main C 1 戻り値の型 関数名 引数 関数ブロックをあらわす中括弧 main() 関数の定義 int main(void){ printf("hello World!!\n"); return 0; 戻り値 1: main() 2.2 C main

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 PowerPoint ppt

3. 標準入出力

Microsoft Word - HOKUSAI_system_overview_ja.docx

Microsoft PowerPoint _5_8_f95a_usui.pptx

Microsoft PowerPoint _4_26_f95a_usui.pptx

資料

kiso2-09.key

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

Taro-ポインタ変数Ⅰ(公開版).j

num2.dvi

Microsoft Word - 3new.doc

Microsoft PowerPoint - 説明3_if文switch文(C_guide3)【2015新教材対応確認済み】.pptx

Microsoft Word - appli_SMASH_tutorial_2.docx

enshu5_1.key

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

Microsoft PowerPoint - compsys2-06.ppt

Microsoft PowerPoint - 講義10改.pptx

スライド 1

PowerPoint プレゼンテーション

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

情報処理演習 B8クラス

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,.,

XMPによる並列化実装2

2 A I / 58

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

kiso2-03.key

cp-7. 配列

memo

Platypus-QM β ( )

Microsoft Word - 資料 (テイラー級数と数値積分).docx

Transcription:

演習 1: 演習準備 2013 年 8 月 6 日神戸大学大学院システム情報学研究科森下浩二 1

演習 1 の内容 神戸大 X10(π-omputer) について システム概要 ログイン方法 コンパイルとジョブ実行方法 OpenMP の演習 ( 入門編 ) 1. parallel 構文 実行時ライブラリ関数 2. ループ構文 3. shared 節 private 節 4. reduction 節 2

神戸大 X10(π-omputer) について 3

神戸大 X10(π-omputer) 富士通 PRIMEHP X10:1 ラック SPAR64 TM IXfx プロセッサ x 96 ノード 総理論演算性能 :20.2TLOPS 総主記憶容量 :3TByte 1 ノード諸元表 ( 京との比較 ) X10 (SPAR64 TM IXfx ) 京 (SPAR64 TM VIIIfx ) コア数 16 8 L1 キャッシュ ( コア ) 32KB(D)/32KB(I) 共有 L2 キャッシュ 12MB 6MB 動作周波数 1.65GHz 2.0GHz 理論演算性能 211.2Glops 128Glops メモリ容量 32GB 16GB 4

X10 へのログイン方法 公開鍵認証によりログイン 手順の詳細は別紙を参照 1. 鍵ペア ( 公開鍵 秘密鍵 ) の作成 2. 仮の鍵ペアでログイン 3. 自身の公開鍵を登録 4. 自身の鍵ペアでログイン出来ることを確認 5. 仮の公開鍵を削除 5

コンパイル方法 逐次プログラム $ frtpx sample.f90 :ortran : 言語 $ fccpx sample.c OpenMP $ frtpx Kopenmp sample.f90 $ fccpx Kopenmp sample.c 自動並列化 ( ノード内スレッド並列 ) $ frtpx Kparallel sample.f90 $ fccpx Kparallel sample.c 6

ジョブ実行方法 ジョブスクリプトの作成 single.sh: 逐次ジョブ #!/bin/sh #PJM -L "rscgrp=school" #PJM -L "node=1" #PJM -L "elapse=10:00" #PJM -j #./a.out シェルを指定 利用リソースグループ名 利用ノード数 最大経過時間 (hh:mm:ss) 標準エラー出力をマージして出力 プログラムの実行 7 ジョブの投入 $ pjsub single.sh

ジョブ実行方法 ジョブスクリプトの作成 thread_omp.sh: スレッド並列 (OpenMP) ジョブ #!/bin/sh #PJM -L "rscgrp=school" #PJM -L "node=1" #PJM -L "elapse=10:00" #PJM -j # export OMP_NUM_THREADS=16./a.out シェルを指定 利用リソースグループ名 利用ノード数 最大経過時間 (hh:mm:ss) 標準エラー出力をマージして出力 OpenMP 並列数を指定 プログラムの実行 環境変数 OMP_NUM_THREADS に OpenMP 並列数を設定 8

ジョブの管理 ジョブの状態表示 $ pjstat [option] -v オプション : 詳細なジョブ情報を表示 -H オプション : 終了したジョブ情報を表示 -A オプション : 全ユーザのジョブ情報を表示 ジョブのキャンセル $ pjdel [JOB_ID] [JOB_ID] は pjstat で表示されるものを指定 例 ) [JOB_ID] が 12345 のジョブをキャンセル $ pjdel 12345 9

ジョブ結果の確認 バッチジョブの実行が終了すると 標準出力ファイルと標準エラー出力ファイルがジョブ投入ディレクトリに出力される 標準出力ファイル : ジョブ名.oXXXXX 標準エラー出力ファイル : ジョブ名.eXXXXX デフォルトのジョブ名はジョブスクリプトのファイル名 XXXXX には [JOB_ID] が入る ジョブスクリプト内で #PJM -j を指定した場合には 標準エラー出力はマージされ標準出力ファイルのみ出力される 例 )p.7 の thread_omp.sh を投入し [JOB_ID] に 12345 が割り当てられた場合 : thread_omp.sh.o12345 が出力 10

OpenMP の演習 ( 入門編 ) 11

OpenMP 復習 ( ノード内 ) スレッド並列のためのAPI 仕様 逐次プログラムに指示文を挿入 parallel 構文 複数のスレッドにより並列実行するリージョンを指定!$ omp parallel 並列リージョン!$ omp end parallel # pragma omp parallel { 並列リージョン 12

OpenMP 演習 1: 実行時ライブラリ関数 並列計算を行う際にプログラムの管理がしやすくなる 関数を利用するには以下の文を追加 include "omp_lib.h" もしくは use omp_lib #include <omp.h> 実行時ライブラリ関数の例 関数名 戻り値 omp_get_thread_num() 自身のスレッド番号 ( 整数 ) omp_get_num_threads() 総スレッド数 ( 整数 ) omp_get_wtime() 経過時間 ( 秒 : 倍精度実数 ) 13

OpenMP 演習 1: 実行時ライブラリ関数 プログラム :omp1.f90 program omp1 use omp_lib implicit none real(8) :: t1, t2 t1 = omp_get_wtime()!$omp parallel print *, "#ID:",omp_get_thread_num(),"of",omp_get_num_threads()!$omp end parallel t2 = omp_get_wtime() print *, "#time:", t2-t1 end program omp1 演習 1 上記のプログラムを作成し コンパイル ジョブ実行し 結果を確認してください 14

OpenMP 演習 1: 実行時ライブラリ関数 プログラム :omp1.c #include <stdio.h> #include <omp.h> int main(void){ double t1, t2; t1 = omp_get_wtime(); #pragma omp parallel { printf("#id: %d of %d n",omp_get_thread_num(),omp_get_num_threads()); t2 = omp_get_wtime(); printf("#time: %le n",t2-t1); return 0; 演習 1 上記のプログラムを作成し コンパイル ジョブ実行し 結果を確認してください 15

OpenMP 演習 1: 実行時ライブラリ関数 実行結果の例 #ID: 11 of 16 #ID: 13 of 16 #ID: 9 of 16 #ID: 1 of 16 #ID: 10 of 16 #ID: 0 of 16 #ID: 5 of 16 #ID: 15 of 16 #ID: 4 of 16 #ID: 6 of 16 #ID: 7 of 16 #ID: 8 of 16 #ID: 2 of 16 #ID: 12 of 16 #ID: 3 of 16 #ID: 14 of 16 #time: 1.557683944702148E-02 16

OpenMP 演習 2: ループ構文 do ループおよび for ループの並列処理!$omp parallel!$omp do do i = 1, n... end do!$omp end do!$omp end parallel #pragma omp parallel { #pragma omp for for(i = 0; i < n; i++){... 又は まとめて!$omp parallel do do i = 1, n... end do!$omp end parallel do #pragma omp parallel for for(i = 0; i < n; i++){... 17

OpenMP 演習 2: ループ構文 プログラム :omp2.f90 program omp2 implicit none integer, parameter :: n = 100000000 real(8) :: x(n), y(n), pi, dx integer :: i pi = 4.0d0*atan(1.0d0) dx = 2.0d0*pi/n do i = 1, n x(i) = dx*i y(i) = sin(x(i)) end do print *, y(1), y(n) end program omp2 演習 2 1. 上記プログラムのdoループ部分をOpenMPで並列化する 2. doループ部分の計算時間を計測 出力し 並列数を変え たときに計算時間がどう変わるかを確認する 18

OpenMP 演習 2: ループ構文 プログラム :omp2.c #include <stdio.h> #include <math.h> int main(void){ int n = 100000000, i; double x[n], y[n], pi, dx; pi = 4.0*atan(1.0); dx = 2.0*pi/n; for(i = 0; i < n; i++){ x[i] = dx*(i+1); y[i] = sin(x[i]); printf("%le %le n", y[0], y[n-1]); return 0; 演習 2 1. 上記プログラムのforループ部分をOpenMPで並列化する 2. forループ部分の計算時間を計測 出力し 並列数を変 えたときに計算時間がどう変わるかを確認する 19

OpenMP 演習 3:shared 節 private 節 データ共有属性 並列リージョン内での変数の共有属性 shared 節 例 ) 変数 a はスレッド間で共有される ( 共有変数 ) private 節 例 )!$omp parallel shared(a) #pragma omp parallel shared(a)!$omp parallel private(b) #pragma omp parallel private(b) 変数 b は各スレッド固有となる ( プライベート変数 ) デフォルトではループ制御変数は private それ以外は shared 20

OpenMP 演習 3:shared 節 private 節 プログラム :omp3.f90 program omp3 implicit none integer, parameter :: n = 100000000 real(8) :: x, y(n), pi, dx integer :: i pi = 4.0d0*atan(1.0d0) dx = 2.0d0*pi/n do i = 1, n x = dx*i y(i) = sin(x) end do print *, y(1), y(n) end program omp3 演習 3 1. 上記プログラムのdoループ部分をOpenMPで並列化する 2. その際 shared, private を明示的に指定してみる 3. 不適切な指定をした場合 どうなるかやってみる 21

OpenMP 演習 3:shared 節 private 節 プログラム :omp3.c #include <stdio.h> #include <math.h> int main(void){ int n = 100000000, i; double x, y[n], pi, dx; pi = 4.0*atan(1.0); dx = 2.0*pi/n; for(i = 0; i < n; i++){ x = dx*(i+1); y[i] = sin(x); printf("%le %le n", y[0], y[n-1]); return 0; 演習 3 1. 上記プログラムのdoループ部分をOpenMPで並列化する 2. その際 shared, private を明示的に指定してみる 3. 不適切な指定をした場合 どうなるかやってみる 22

OpenMP 演習 4:reduction 節 データ共有属性 reduction 節 例 )!$omp parallel reduction(+:c) #pragma omp parallel reduction(+:c) 変数 c は private と同様各スレッド固有であるが 並列リージョン終了時に全スレッドについて総和 (+) がとられる 指定した演算で各スレッドの値を集計した結果が代入される 演算子 : +, -, * 等 一部組み込み関数 (ortran): max, min 等 23

OpenMP 演習 4:reduction 節 プログラム :omp4.f90 program omp4 implicit none integer, parameter :: n = 100000000 real(8) :: x(n), y(n), pi, dx, z, l1, l2 integer :: i pi = 4.0d0*atan(1.0d0) dx = 2.0d0*pi/n do i = 1, n x(i) = dx*i y(i) = sin(x(i)) end do l1 = 0.0d0 l2 = 0.0d0 do i = 1, n z = x(i)*y(i) l1 = l1 + z*dx l2 = l2 + z*(1.0d0-z)*dx end do print *, l1, l2 end program omp4 演習 4 1. 上記プログラムの 2 つの do ループ部分を OpenMP で並列化する 2. reduction の指定が不適切な場合 どうなるかやってみる 24

OpenMP 演習 4:reduction 節 プログラム :omp4.c #include <stdio.h> #include <math.h> int main(void){ int n = 100000000, i; double x[n], y[n], pi, dx, z, l1, l2; pi = 4.0*atan(1.0); dx = 2.0*pi/n; for(i = 0; i < n; i++){ x[i] = dx*(i+1); y[i] = sin(x[i]); l1 = 0.0; l2 = 0.0; for(i = 0; i < n; i++){ z = x[i]*y[i]; l1 += z*dx; l2 += z*(1.0-z)*dx; printf("%le %le n", l1, l2); return 0; 演習 4 1. 上記プログラムの 2 つの for ループ部分を OpenMP で並列化する 2. reduction の指定が不適切な場合 どうなるかやってみる 25