内容 イントロダクション スカラチューニング OpenMPによる並列化 最近のHPC分野の動向 まとめ
|
|
|
- はな いんそん
- 7 years ago
- Views:
Transcription
1 スカラチューニングと OpenMPによるコードの高速化 松本洋介 千葉大学 謝辞 C言語への対応 簑島敬 JAMSTEC 宇宙磁気流体 プラズマシミュレーションサマースクール 2013年8月6日 千葉大学統合情報センター
2 内容 イントロダクション スカラチューニング OpenMPによる並列化 最近のHPC分野の動向 まとめ
3 イントロダクション
4 CPUの作り \ Fujitsu SPARC64TM VIIIfx
5 命令実行の流れ 1.命令による実行 ② ③ 実行にかかる時間は主に による 2.データの入出力 ① ④
6 メモリの階層構造 京の場合 register : 1 cycle L1$: 32 kb,? GB/s L2$: 6MB, >180 GB/s Memory: 16GB, 64GB/s
7 私のスパコン利用暦 2000 vpp800 (Fujitsu) vpp5000 (Fujitsu) 2009 FX1 (Fujitsu) FX10 (Fujitsu) 京 (Fujitsu) sx6 (NEC) sx9 (NEC) XT4 (Cray) XC30 (Cray)
8 私のスパコン利用暦 ベクトル計算機時代 2000 vpp800 (Fujitsu) vpp5000 (Fujitsu) 2009 FX1 (Fujitsu) FX10 (Fujitsu) 京 (Fujitsu) sx6 (NEC) sx9 (NEC) XT4 (Cray) XC30 (Cray)
9 私のスパコン利用暦 ベクトル計算機時代 2000 vpp800 (Fujitsu) vpp5000 (Fujitsu) スカラ計算機時代 2009 FX1 (Fujitsu) FX10 (Fujitsu) 京 (Fujitsu) sx6 (NEC) sx9 (NEC) XT4 (Cray) XC30 (Cray)
10 スカラ ベクトル スカラ 同じ車を何台も作る 作業に例えると ベクトル 演算のパイプライン処理 サイクル 2台目 3台目 do k=1,100 do j=1,100 do i=1,100 a(i,j,k) = c*b(i,j,k)+d(i,j,k)
11 近年の演算処理の高速化のしくみ サイクル時間 1/周波数 の短縮 周波数 3GHzで頭打ち ベクトル化 パイプライン処理 SIMD 複数演算器 メモリ構造の階層化 並列化 マルチコア
12 近年の演算処理の高速化のしくみ サイクル時間 1/周波数 の短縮 周波数 3GHzで頭打ち ベクトル化 パイプライン処理 SIMD 複数演算器 メモリ構造の階層化 並列化 マルチコア
13 近年の演算処理の高速化のしくみ サイクル時間 1/周波数 の短縮 周波数 3GHzで頭打ち ベクトル化 パイプライン処理 SIMD 複数演算器 メモリ構造の階層化 並列化 マルチコア ユーザから見たら同じ
14 近年の演算処理の高速化のしくみ サイクル時間 1/周波数 の短縮 周波数 3GHzで頭打ち ベクトル化 パイプライン処理 SIMD 複数演算器 ユーザから見たら同じ メモリ構造の階層化 並列化 マルチコア 近年の計算機では SIMD化 キャッシュヒット率の向 上 マルチコアによる並列化が高速化のポイント
15 スカラチューニング
16 対象 宇宙磁気流体プラズマシミュレーションにかか わること すなわち 差分法 磁気流体 MHD ブラソフシミュレー ション 粒子法 電磁粒子 PIC シミュレーション 行列の演算 例 LU分解など は対象外 Fortran, C
17 注意 一般に チューニングすると可読性が損なわれ ます まずは読みやすいコードを書き 充分テ ストしてバグを除いてからチューニングを行い ましょう
18 チューニングが必要 無理にしなくて良いです 好きでもしんどい 最先端 大規模 シミュレーション研究では必 須 なぜなら 1ランで数週間 2倍の速度向上で10日単位の短縮 京 などの大規模計算申請書類では 実行効 率 並列化率などの情報が求められる 実行効率10%以上あれば 計算機資源の獲得にお いて 他分野との競争力になる
19 チューニングの手順 編集 コンパイル コンパイルリスト 最適化されているか Yes 実行 プロファイラ 一番重いルーチンは No
20 コンパイルリスト 最適化情報の詳細を出力 インライン展開等の最適化 SIMD化 並列化 コンパイルオプション gcc/gfortran: N/A icc/ifort: -opt-report, -vec-report, -par-report
21 プロファイラの利用 各サブルーチンの経過時間を計測 ホットスポット 一番処理が重いサブルーチン から最適化 商用コンパイラ intel, PGI, スパコン等 では 詳細情報 キャッシュミス率 FLOPS が得られる GNUでは gprof gprofの使い方 gfortran (gcc) -pg test.f90 ifort (icc) -p test.f90./a.out gprof./a.out gmon.out > output.txt output.txt
22 スカラチューニングのポイント コンパイラ 人 にやさしいプログラム構造 ループ内で分岐は使わない if文の代わりにmin, max, sign で goto文は不可 ループ内処理を単純にする SIMD化促進 外部関数のインライン展開 データの局所化を高める 使用するデータはなるべくひとまとめにして キャッ シュに乗るようにする データの再利用 連続アクセス ポインタは使わない Fortran
23 基本的なtips 原因不明で異常終了したら unlimitコマンド スタック領 域 静的変数 のサイズの制限を開放 割り算を掛け算に a(i) = b(i)/c c = 1.0/c ; a(i) = b(i)*c べき乗表記はなるべく使わない a(i) = b(i)**2 a(i) = b(i)*b(i) a(i) = b(i)**0.5 a(i) = sqrt(b(i)) 因数分解をして演算数を削減 y=a*x*x*x*x+b*x*x*x+c*x*x+d*x y=x*(d+x*(c+x*(b+x*(a)))) 演算回数13 7 一時変数は出来る限り再利用 レジスタの節約
24 分岐処理の回避1 Fortran: do i=1,nx if(a /= 0.0)then b(i) = c(i)/a else b(i) = c(i) endif if(a == 0.0) a=1.0 a = 1.0/a do i=1,nx b(i) = c(i)*a
25 分岐処理の回避2 minmod関数 Fortran: do i=1,nx if(a(i)*b(i) < 0.0)then c(i) = 0 else c(i) = sign(1.0,a(i)) & *min(abs(a(i)),abs(b(i))) endif do i=1,nx c(i) = sign(1.0,a(i)) *max(0.0, min(abs(a(i)), sign(1.0,a(i))*b(i)) ) & & & &
26 SIMD: Single Instruction Multiple Data ユーザレベルではベクトル化と同 じ ただし ベクトル長は2 4 と ベクトル計算機のそれ 256 に比べてずっと短い 最内側ループに対してベクトル化 最近ではループ内にIF文が入って いてもSIMD化してくれる マス ク付きSIMD化 真率が高けれ ば効果的 コンパイルオプションで最適化 gcc/gfortran: -m{avx, sse4} icc/ifort: -x{avx,sse4} from K computer manual from K computer manual
27 SIMD化の阻害例 SIMD化されない 書き方の工夫 SIMD化される 例1: ループ番号間に依存性がある場合 a(1) = dx do i=2,nx a(i) = a(i-1)+dx do i=1,nx a(i) = i*dx 例2: ループ番号によって処理が異なる場合 do i=1,nx if(a(i) < 0)then b(i-1) = c*a(i) else b(i+1) = c*a(i) endif do i=1,nx w1 = 0.5*(1.0-sign(1.0,a(i))) w2 = 0.5*(1.0+sign(1.0,a(i))) b(i-1) = c*w1*a(i) b(i+1) = c*w2*a(i)
28 配列の宣言とメモリ空間1 (Fortran) dimension a(nx,ny) 配列aのメモリ空間上での配置は a(i-1,j-1) a(i,j-1) a(i+1,j-1)... a(i-1,j) nx do i=1,nx do j=1,ny a(i,j) = i+j 間隔nxで飛び飛びにアドレスにア クセスすることになるので メモ リへの書き込みが非常に遅い a(i,j) a(i+1,j)... a(i-1,j+1) a(i,j+1) a(i+1,j+1) nx do j=1,ny do i=1,nx a(i,j) = i+j アドレスに連続アクセスするの で メモリへの書き込みが速い
29 配列の宣言とメモリ空間1 (C/C++) float a[ny][nx]; 配列aのメモリ空間上での配置は a[j-1][i-1] a[j-1][i] a[j-1][i+1]... a[j][i-1] nx for(i=0;i<nx;i++){ for(j=0;j<ny;j++){ a[j][i] = i+j; } } 間隔nxで飛び飛びにアドレスにア クセスすることになるので メモ リへの書き込みが非常に遅い a[j][i] a[j][i+1]... a[j+1][i-1] a[j+1][i] a[j+1][i+1] nx for(j=0;j<ny;j++){ for(i=0;i<nx;i++){ a[j][i] = i+j; } } アドレスに連続アクセスするの で メモリへの書き込みが速い
30 配列の宣言とメモリ空間2 連続の式 rn+1 = f(rn,vxn,vyn) 次のステップに進むためには 自分自身 r の他に速度 場が必要 dimension rho(nx,ny), vx(nx,ny), vy(nx,ny),... と変数を個別に用意する代わりに dimension f(8,nx,ny)! 1:rho, 2:p, 3-5:v, 6-8:B のように 一つの変数にまとめて配列を用意する このよ うにすると 必要となる各物理量がメモリ空間上の近い位 置に配置される キャッシュラインにのりやすい シ ステム方程式を解くための工夫
31 配列の宣言とメモリ空間2 続き TypeA: f(nx,nx,nz,8) TypeB: f(8,nx,nx,nz) 近年のキャッシュ重視型のスパコンにおいて効果的 Fukazawa et al., IEEE Trans. Plasma Sci., 2010.
32 配列の宣言とメモリ空間3 C言語 C言語で静的に配列を宣言する場合は float a[ny][nx]; とするが 領域分割の並列計算では動的に mallocで 配列 を確保する場合が多く 上記の宣言では難しい 2次元配列 を1次元配列として宣言する方が メモリ空間上で連続的に 領域を確保できる double *a; a=(double*)malloc(sizeof(double)*nx*ny); for (j=0;j<ny;j++){ for (i=0;i<nx;i++){ a[nx*j+i] = i+j; } }
33 キャッシュと配列ブロック 2次キャッシュ容量 数MB 倍精度で100x100x100グリッド分程度 MHD計算の1ノードあたりの配列数としては まだ ちょっと足りない PIC計算では セル内の粒子が必要なグリッド上の場 のデータがキャッシュに乗らない 配列ブロック 必要なデータだけをキャッシュに収まる程度の別の小 さな配列に事前に格納 PIC法で(i,j,k)セルに属する粒子が必要な場の情報をあ らかじめパック tmp(1:6,-1:1,-1:1,-1:1) = f(1:6,i-1:i+1,j-1:j+1,k-1:k+1)
34 インライン展開 外部 ユーザー定義 関数はプログラムの可読性向上に一 役 しかし do i=1,nx a(i) = myfunc(b(i)) のように ループ内で繰り返し呼び出す場合 呼び出しの オーバーヘッドが大きい 関数内の手続きが短い場合は 内容をその場所に展開する インライン展開 コンパイル時に指定 同一ファイル内に定義される関数 gcc/gfortran: -O3 もしくは -finline-functions icc: -O{2,3}, ifort: -finline コンパイル時に指定 別ファイル内に定義される関数 icc/ifort: -fast もしくは -ipo
35 OpenMPによるコードの並列化
36 アムダールの法則 全処理=1 並列数=1 逐次処理 (1-p) 並列化可能部分 (p) 並列数=2 p/2... 並列数=n Amdahl s Law p/n Parallel Portion 50% 75% 90% 95% 性能向上率 = 1 p (1 p)+ n 少なくも並列化率p>0.95である必要あり Number of Processors
37 スレッド並列とプロセス並列 スレッド並列 プロセス並列 プロセス スレッド1 スレッド2 プライベー ト変数 プライベー ト変数 スレッド3 プライベー ト変数 グローバル変数 メモリ空間 プロセス1 プロセス2 プロセス3 メモリ空間 メモリ空間 メモリ空間 プロセス4 プロセス5 プロセス6 メモリ空間 メモリ空間 メモリ空間 スレッドn プライベー ト変数
38 ハイブリッド並列 プロセス1-3 プロセス4-6 プロセス7 thrd1 thrd2 thrd3 thrd4 プロセス7-9 メモリ空間 プロセス10-12 プロセス13-15 プロセス16-18 この例では全72並列 プロセス間はMPIによる通信 各プロセスに4スレッド スレッド数分プロセス数を削減 MPIによる通信 同期待ちの オーバヘッドを軽減 出力ファイル数の削減
39 スレッド並列計算を行うためのAPI コンパイルオプションで有効 gcc/gfortran: -fopenmp icc/ifort: -openmp プログラムに指示行を挿入 オプション無効時はコメント 行と見なされる C言語は警告される場合も 自動並列化に比べて柔軟に最適化が可能 標準規格なため マシン コンパイラに依らずポータブル 2013年8月現在 OpenMP 4.0 SIMD化の指示行 アクセ ラレータ 後述 への対応
40 スレッド数の設定 基本的にはシェルの環境変数 $OMP_NUM_THREADS でスレッド数を指定する setenv OMP_NUM_THREADS 8 指定しなければ システムの全コア数 プログラム内部で関数で設定 omp_lib/omp.hをインク ルードする必要あり Fortran: C:!$use omp_lib integer, parameter :: nthrd = 8 #include <omp.h> int nthrd=8; call omp_set_num_threads(nthrd) omp_set_num_threads(nthrd);
41 全体の流れ fork-join モデル Fortran: 逐次処理 fork 並列処理 join 逐次処理 C: #include <stdio.h> #include <omp.h> int main(void) { puts( serial region ); #pragma omp parallel { puts( parallel region ); } puts( serial region ); return 0; }
42 ループの並列化 i=1-100を *$OMP_SCHEDULE SCHEDULE句で 分担方法変更可 各スレッドが!$OMP PARALLEL DO #pragma omp parallel for do i=1,100 均等に分担 for (i=0;i<100;i++){ b(i) = c*a(i) スレッドの立ち上げはb[i]=c*a[i]; }!$OMP END PARALLEL DO なるべくまとめて mysub(b); call mysub(b) #pragma omp parallel!$omp PARALLEL {!$OMP DO #pragma omp for do i=1,100 for (i=0;i<100;i++){ d(i) = c*b(i) d[i]=c*b[i]; } pragma omp for の!$OMP END DO 直後のforループが並列#pragma omp for!$omp DO do i=1,100 処理される 間に { を for (i=0;i<100;i++){ e[i]=c*d[i]; e(i) = c*d(i) 入れてはならない } }!$OMP END DO!$OMP END PARALLEL
43 多重ループの並列化 スレッドの立ち上げ do j=1,100 が100回も行われ for (j=0;j<100;j++){!$omp PARALLEL DO オーバーヘッドが #pragma omp parallel for do i=1,100 for (i=0;i<100;i++){ 大きい b(i,j) = c*a(i,j) b[j][i]=c*a[j][i]; }!$OMP END PARALLEL DO } 最外ループを並列化 #pragma omp parallel!$omp PARALLEL DO & 内側ループのカウンタ {!$OMP PRIVATE(i) 変数 i はプライベート #pragma omp for private(i) do j=1,100 宣言が必要 for (j=0;j<100;j++){ do i=1,100 for (i=0;i<100;i++){ b(i,j) = c*a(i,j) b[j][i]=c*a[j][i]; } }!$OMP END PARALLEL DO }
44 多重ループの並列化 続き 多重ループでは最外ループを並列化するのが基本 ループ の内側に指示行を入れると 外側ループの回転数分スレッ ドのfork/joinが行われ オーバーヘッドが大きくなる 内側にあるループのカウンタ変数 i, j,.. はスレッド固有 の変数とする必要があるため PRIVATE宣言をする そう しないと スレッド間で上書きしてしまう
45 グローバル プライベート変数!$OMP PARALLEL DO do i=1,100 tmp = myfunc(i) a(i) = tmp!$omp END PARALLEL DO スレッド間でtmpを 上書きしまうので正 しい結果が得られな い #pragma omp parallel for for (i=0;i<100;i++){ tmp=myfunc(i); a[i]=tmp; } Cの場合はループ内 で変数宣言すれば問 題なし!$OMP PARALLEL DO &!$OMP PRIVATE(tmp) do i=1,100 tmp = myfunc(i) a(i) = tmp!$omp END PARALLEL DO #pragma omp parallel{ #pragma omp parallel for #pragma omp for private(tmp) for (i=0;i<100;i++){ for (i=0;i<100;i++){ double tmp; tmp=myfunc(i); tmp=myfunc(i); a[i]=tmp; a[i]=tmp; } } }
46 ループ内変数の演算 (REDUCTION) sum = 0.0!$OMP PARALLEL DO &!$OMP REDUCTION(+:sum) do i=1,10 sum = sum+i!$omp END PARALLEL DO sum=1.0; #pragma omp parallel for reduction(+:sum) for (i=0;i<10;i++){ sum+=i; } 実用上 総和 + 以外使う機会はあまりない
47 単スレッド処理 (SINGLE)!$OMP PARALLEL!$OMP DO do i=1,100 b(i) = c*a(i)!$omp END DO!$OMP SINGLE call output(b)!$omp END SINGLE!$OMP DO do i=1,100 d(i) = c*b(i)!$omp END DO!$OMP END PARALLEL スレッドの立ち上げ #pragma omp parallel を最初に一回だけ { #pragma omp for for (i=0;i<100;i++){ b[i]=c*a[i]; } 途中で逐次処理が入る #pragma omp single 場合はSINGLEで対処 { output(b); } #pragma omp for for (i=0;i<100;i++){ d[i]=c*b[i]; } } スレッドの立ち上げ回数はなるべく少なく データ入出力な ど 途中で逐次処理が必要な場合に使う
48 バリア同期の回避 (NOWAIT)!$OMP PARALLEL!$OMP DO do i=1,100 b(i) = c*a(i)!$omp END DO NOWAIT!$OMP DO do i=1,100 d(i) = c*b(i)!$omp END DO!$OMP DO do i=1,200 e(i) = c*d(i)!$omp END DO NOWAIT!$OMP END PARALLEL #pragma omp parallel ループの終わりで暗黙 { に行われるスレッド #pragma omp for nowait for (i=0;i<100;i++){ 間の同期待ちを b[i]=c*a[i]; NOWAITで回避 } #pragma omp for 次のループではスレッド for (i=0;i<100;i++){ に対する変数 d の割り当 d[i]=c*b[i]; } て範囲が変わるので 同期が必要 注意 #pragma omp for nowait for (i=0;i<100;i+=2){ e[i]=c*d[i]; } } スレッド数が大きい場合に高速化に寄与する
49 OpenMP実装上の注意点 ユーザが並列処理箇所を明示するため 並列計算に伴う 問題発生はプログラマが責任を負う 自動並列化との違 い 並列処理してはいけない箇所でも 明示したら並列化さ れてしまう スレッド内でグローバル/プライベート変数を間違えると 結果が不定 NOWAITで必要な同期を忘れると結果が不定 同じプログラムを数回は実行して 結果が変わらないこ との確認が必要 実装は簡単だけど デバッグに注意が必要
50 最近のHPC分野の動向
51 TOP500 (2013年6月現在 ペタFLOPS メガW時代
52 TOP500 (2013年6月現在 ペタFLOPS メガW時代
53 10 MW?
54 GREEN500 性能 消費電力 BGQ (IBM) 強し 専用CPUの躍進
55 GPGPU vs. MIC NVIDIA TESLA ゲーム用途のGPUをHPCに応用 GPGPU) CUDA/OpenACCによるプログラミング 基本C/C++ PGI Fortranでも可能 NVIDIAが買収 intel Xeon Phi x86互換のコプロセッサ ~ 60 core 既存のコードから容易に拡張可能 OpenMP 4.0で更に高機能に利用可能 これまでの講義内容をやっていれば さほ ど手間なくそこそこの性能が出るはず ともにアクセラレータ PCIe2.0で各ノード に付け加えられる
56 国内HPCIシステム
57 国内HPCIシステム GPGPU計算機
58 国内HPCIシステム GPGPU計算機 ベクトル計算機
59 エクサFLOPS メガW時代へ 電力消費量はこれ以上増やせないので 5年後には専用CPU と組み合わせたスパコンが国内でも増えてくる 汎用 専用CPU構成のヘテロジニアスなシステムへ ユーザのプログラム負担が増える可能性 シミュレーション研究者の宿命だが 5~10年くらいの周期で スパコンシステムのトレンドに振り回される ベクトル vs. スーパースカラ MPI vs. HPF (High Performance Fortran) 私は2009年に手持ちのコード MHD/PIC を再コーディ ング スパコン情勢に注意しつつ 研究を進めましょう
60 まとめ スカラチューニング OpenMPによるスレッド並列化 高速化のためのCPUの機能 SIMD をいかに使い倒すか キャッシュチューニング 指示行を最外ループの手前にいれるだけ 簡単 スレッド並列化によりプロセス数を減らし 通信のオー バーヘッドを軽減 ハイブリッド並列化 今後の展望 次世代の エクサ スパコンでは電力消費量問題が顕在化 汎用 専用CPUで構成されるヘテロジニアスシステムに ハイブリッド並列化はますます必須
61 参考資料 プロセッサを支える技術 Hisa Ando著 技術評 論社 各スパコンマニュアル
コードのチューニング
OpenMP による並列化実装 八木学 ( 理化学研究所計算科学研究センター ) KOBE HPC Spring School 2019 2019 年 3 月 14 日 スレッド並列とプロセス並列 スレッド並列 OpenMP 自動並列化 プロセス並列 MPI プロセス プロセス プロセス スレッドスレッドスレッドスレッド メモリ メモリ プロセス間通信 Private Private Private
演習1: 演習準備
演習 1: 演習準備 2013 年 8 月 6 日神戸大学大学院システム情報学研究科森下浩二 1 演習 1 の内容 神戸大 X10(π-omputer) について システム概要 ログイン方法 コンパイルとジョブ実行方法 OpenMP の演習 ( 入門編 ) 1. parallel 構文 実行時ライブラリ関数 2. ループ構文 3. shared 節 private 節 4. reduction 節
openmp1_Yaguchi_version_170530
並列計算とは /OpenMP の初歩 (1) 今 の内容 なぜ並列計算が必要か? スーパーコンピュータの性能動向 1ExaFLOPS 次世代スハ コン 京 1PFLOPS 性能 1TFLOPS 1GFLOPS スカラー機ベクトル機ベクトル並列機並列機 X-MP ncube2 CRAY-1 S-810 SR8000 VPP500 CM-5 ASCI-5 ASCI-4 S3800 T3E-900 SR2201
(Microsoft PowerPoint \215u\213`4\201i\221\272\210\344\201j.pptx)
AICS 村井均 RIKEN AICS HPC Summer School 2012 8/7/2012 1 背景 OpenMP とは OpenMP の基本 OpenMP プログラミングにおける注意点 やや高度な話題 2 共有メモリマルチプロセッサシステムの普及 共有メモリマルチプロセッサシステムのための並列化指示文を共通化する必要性 各社で仕様が異なり 移植性がない そして いまやマルチコア プロセッサが主流となり
01_OpenMP_osx.indd
OpenMP* / 1 1... 2 2... 3 3... 5 4... 7 5... 9 5.1... 9 5.2 OpenMP* API... 13 6... 17 7... 19 / 4 1 2 C/C++ OpenMP* 3 Fortran OpenMP* 4 PC 1 1 9.0 Linux* Windows* Xeon Itanium OS 1 2 2 WEB OS OS OS 1 OS
Microsoft PowerPoint - sales2.ppt
最適化とは何? CPU アーキテクチャに沿った形で最適な性能を抽出できるようにする技法 ( 性能向上技法 ) コンパイラによるプログラム最適化 コンパイラメーカの技量 経験量に依存 最適化ツールによるプログラム最適化 KAP (Kuck & Associates, Inc. ) 人によるプログラム最適化 アーキテクチャのボトルネックを知ること 3 使用コンパイラによる性能の違い MFLOPS 90
Microsoft PowerPoint - 演習1:並列化と評価.pptx
講義 2& 演習 1 プログラム並列化と性能評価 神戸大学大学院システム情報学研究科横川三津夫 [email protected] 2014/3/5 RIKEN AICS HPC Spring School 2014: プログラム並列化と性能評価 1 2014/3/5 RIKEN AICS HPC Spring School 2014: プログラム並列化と性能評価 2 2 次元温度分布の計算
Microsoft Word ●IntelクアッドコアCPUでのベンチマーク_吉岡_ _更新__ doc
2.3. アプリ性能 2.3.1. Intel クアッドコア CPU でのベンチマーク 東京海洋大学吉岡諭 1. はじめにこの数年でマルチコア CPU の普及が進んできた x86 系の CPU でも Intel と AD がデュアルコア クアッドコアの CPU を次々と市場に送り出していて それらが PC クラスタの CPU として採用され HPC に活用されている ここでは Intel クアッドコア
研究背景 大規模な演算を行うためには 分散メモリ型システムの利用が必須 Message Passing Interface MPI 並列プログラムの大半はMPIを利用 様々な実装 OpenMPI, MPICH, MVAPICH, MPI.NET プログラミングコストが高いため 生産性が悪い 新しい並
XcalableMPによる NAS Parallel Benchmarksの実装と評価 中尾 昌広 李 珍泌 朴 泰祐 佐藤 三久 筑波大学 計算科学研究センター 筑波大学大学院 システム情報工学研究科 研究背景 大規模な演算を行うためには 分散メモリ型システムの利用が必須 Message Passing Interface MPI 並列プログラムの大半はMPIを利用 様々な実装 OpenMPI,
Slides: TimeGraph: GPU Scheduling for Real-Time Multi-Tasking Environments
計算機アーキテクチャ第 11 回 マルチプロセッサ 本資料は授業用です 無断で転載することを禁じます 名古屋大学 大学院情報科学研究科 准教授加藤真平 デスクトップ ジョブレベル並列性 スーパーコンピュータ 並列処理プログラム プログラムの並列化 for (i = 0; i < N; i++) { x[i] = a[i] + b[i]; } プログラムの並列化 x[0] = a[0] + b[0];
OpenMP (1) 1, 12 1 UNIX (FUJITSU GP7000F model 900), 13 1 (COMPAQ GS320) FUJITSU VPP5000/64 1 (a) (b) 1: ( 1(a))
OpenMP (1) 1, 12 1 UNIX (FUJITSU GP7000F model 900), 13 1 (COMPAQ GS320) FUJITSU VPP5000/64 1 (a) (b) 1: ( 1(a)) E-mail: {nanri,amano}@cc.kyushu-u.ac.jp 1 ( ) 1. VPP Fortran[6] HPF[3] VPP Fortran 2. MPI[5]
OpenMPプログラミング
OpenMP 基礎 岩下武史 ( 学術情報メディアセンター ) 1 2013/9/13 並列処理とは 逐次処理 CPU1 並列処理 CPU1 CPU2 CPU3 CPU4 処理 1 処理 1 処理 2 処理 3 処理 4 処理 2 処理 3 処理 4 時間 2 2 種類の並列処理方法 プロセス並列 スレッド並列 並列プログラム 並列プログラム プロセス プロセス 0 プロセス 1 プロセス間通信 スレッド
スパコンに通じる並列プログラミングの基礎
2018.06.04 2018.06.04 1 / 62 2018.06.04 2 / 62 Windows, Mac Unix 0444-J 2018.06.04 3 / 62 Part I Unix GUI CUI: Unix, Windows, Mac OS Part II 2018.06.04 4 / 62 0444-J ( : ) 6 4 ( ) 6 5 * 6 19 SX-ACE * 6
<4D F736F F F696E74202D D F95C097F D834F E F93FC96E5284D F96E291E85F8DE391E52E >
SX-ACE 並列プログラミング入門 (MPI) ( 演習補足資料 ) 大阪大学サイバーメディアセンター日本電気株式会社 演習問題の構成 ディレクトリ構成 MPI/ -- practice_1 演習問題 1 -- practice_2 演習問題 2 -- practice_3 演習問題 3 -- practice_4 演習問題 4 -- practice_5 演習問題 5 -- practice_6
スパコンに通じる並列プログラミングの基礎
2016.06.06 2016.06.06 1 / 60 2016.06.06 2 / 60 Windows, Mac Unix 0444-J 2016.06.06 3 / 60 Part I Unix GUI CUI: Unix, Windows, Mac OS Part II 0444-J 2016.06.06 4 / 60 ( : ) 6 6 ( ) 6 10 6 16 SX-ACE 6 17
ÊÂÎó·×»»¤È¤Ï/OpenMP¤Î½éÊâ¡Ê£±¡Ë
2015 5 21 OpenMP Hello World Do (omp do) Fortran (omp workshare) CPU Richardson s Forecast Factory 64,000 L.F. Richardson, Weather Prediction by Numerical Process, Cambridge, University Press (1922) Drawing
スパコンに通じる並列プログラミングの基礎
2018.09.10 [email protected] ( ) 2018.09.10 1 / 59 [email protected] ( ) 2018.09.10 2 / 59 Windows, Mac Unix 0444-J [email protected] ( ) 2018.09.10 3 / 59 Part I Unix GUI CUI:
プログラミング実習I
プログラミング実習 I 05 関数 (1) 人間システム工学科井村誠孝 [email protected] 関数とは p.162 数学的には入力に対して出力が決まるもの C 言語では入出力が定まったひとまとまりの処理 入力や出力はあるときもないときもある main() も関数の一種 何かの仕事をこなしてくれる魔法のブラックボックス 例 : printf() 関数中で行われている処理の詳細を使う側は知らないが,
memo
数理情報工学演習第一 C プログラミング演習 ( 第 5 回 ) 2015/05/11 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 今日の内容 : プロトタイプ宣言 ヘッダーファイル, プログラムの分割 課題 : 疎行列 2 プロトタイプ宣言 3 C 言語では, 関数や変数は使用する前 ( ソースの上のほう ) に定義されている必要がある. double sub(int
OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£±¡Ë
2012 5 24 scalar Open MP Hello World Do (omp do) (omp workshare) (shared, private) π (reduction) PU PU PU 2 16 OpenMP FORTRAN/C/C++ MPI OpenMP 1997 FORTRAN Ver. 1.0 API 1998 C/C++ Ver. 1.0 API 2000 FORTRAN
TSUBAME2.0 における GPU の 活用方法 東京工業大学学術国際情報センター丸山直也第 10 回 GPU コンピューティング講習会 2011 年 9 月 28 日
TSUBAME2.0 における GPU の 活用方法 東京工業大学学術国際情報センター丸山直也第 10 回 GPU コンピューティング講習会 2011 年 9 月 28 日 目次 1. TSUBAMEのGPU 環境 2. プログラム作成 3. プログラム実行 4. 性能解析 デバッグ サンプルコードは /work0/gsic/seminars/gpu- 2011-09- 28 からコピー可能です 1.
C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ
C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 今回のプログラミングの課題 次のステップによって 徐々に難易度の高いプログラムを作成する ( 参照用の番号は よくわかる C 言語 のページ番号 ) 1. キーボード入力された整数 10 個の中から最大のものを答える 2. 整数を要素とする配列 (p.57-59) に初期値を与えておき
Microsoft PowerPoint - 09.pptx
情報処理 Ⅱ 第 9 回 2014 年 12 月 22 日 ( 月 ) 関数とは なぜ関数 関数の分類 自作関数 : 自分で定義する. ユーザ関数 ユーザ定義関数 などともいう. 本日のテーマ ライブラリ関数 : 出来合いのもの.printf など. なぜ関数を定義するのか? 処理を共通化 ( 一般化 ) する プログラムの見通しをよくする 機能分割 ( モジュール化, 再利用 ) 責任 ( あるいは不具合の発生源
GPU チュートリアル :OpenACC 篇 Himeno benchmark を例題として 高エネルギー加速器研究機構 (KEK) 松古栄夫 (Hideo Matsufuru) 1 December 2018 HPC-Phys 理化学研究所 共通コードプロジェクト
GPU チュートリアル :OpenACC 篇 Himeno benchmark を例題として 高エネルギー加速器研究機構 (KEK) 松古栄夫 (Hideo Matsufuru) 1 December 2018 HPC-Phys 勉強会 @ 理化学研究所 共通コードプロジェクト Contents Hands On 環境について Introduction to GPU computing Introduction
プログラミングI第10回
プログラミング 1 第 10 回 構造体 (3) 応用 リスト操作 この資料にあるサンプルプログラムは /home/course/prog1/public_html/2007/hw/lec/sources/ 下に置いてありますから 各自自分のディレクトリにコピーして コンパイル 実行してみてください Prog1 2007 Lec 101 Programming1 Group 19992007 データ構造
cp-7. 配列
cp-7. 配列 (C プログラムの書き方を, パソコン演習で学ぶシリーズ ) https://www.kkaneko.jp/cc/adp/index.html 金子邦彦 1 本日の内容 例題 1. 月の日数配列とは. 配列の宣言. 配列の添え字. 例題 2. ベクトルの内積例題 3. 合計点と平均点例題 4. 棒グラフを描く配列と繰り返し計算の関係例題 5. 行列の和 2 次元配列 2 今日の到達目標
OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£±¡Ë
2011 5 26 scalar Open MP Hello World Do (omp do) (omp workshare) (shared, private) π (reduction) scalar magny-cours, 48 scalar scalar 1 % scp. ssh / authorized keys 133. 30. 112. 246 2 48 % ssh 133.30.112.246
GPGPUクラスタの性能評価
2008 年度理研 HPC シンポジウム第 3 世代 PC クラスタ GPGPU クラスタの性能評価 2009 年 3 月 12 日 富士通研究所成瀬彰 発表の概要 背景 GPGPU による高速化 CUDA の概要 GPU のメモリアクセス特性調査 姫野 BMT の高速化 GPGPU クラスタによる高速化 GPU Host 間のデータ転送 GPU-to-GPU の通信性能 GPGPU クラスタ上での姫野
PowerPoint プレゼンテーション
講座準備 講座資料は次の URL から DL 可能 https://goo.gl/jnrfth 1 ポインタ講座 2017/01/06,09 fumi 2 はじめに ポインタはC 言語において理解が難しいとされる そのポインタを理解することを目的とする 講座は1 日で行うので 詳しいことは調べること 3 はじめに みなさん復習はしましたか? 4 & 演算子 & 演算子を使うと 変数のアドレスが得られる
演習準備
演習準備 2014 年 3 月 5 日神戸大学大学院システム情報学研究科森下浩二 1 演習準備の内容 神戸大 FX10(π-Computer) 利用準備 システム概要 ログイン方法 コンパイルとジョブ実行方法 MPI 復習 1. MPIプログラムの基本構成 2. 並列実行 3. 1 対 1 通信 集団通信 4. データ 処理分割 5. 計算時間計測 2 神戸大 FX10(π-Computer) 利用準備
並列プログラミング入門(OpenMP編)
登録施設利用促進機関 / 文科省委託事業 HPCI の運営 代表機関一般財団法人高度情報科学技術研究機構 (RIST) 1 並列プログラミング入門 (OpenMP 編 ) 2019 年 1 月 17 日 高度情報科学技術研究機構 (RIST) 山本秀喜 RIST 主催の講習会等 2 HPC プログラミングセミナー 一般 初心者向け : チューニング 並列化 (OpenMP MPI) 京 初中級者向け講習会
計算機アーキテクチャ
計算機アーキテクチャ 第 11 回命令実行の流れ 2014 年 6 月 20 日 電気情報工学科 田島孝治 1 授業スケジュール ( 前期 ) 2 回日付タイトル 1 4/7 コンピュータ技術の歴史と コンピュータアーキテクチャ 2 4/14 ノイマン型コンピュータ 3 4/21 コンピュータのハードウェア 4 4/28 数と文字の表現 5 5/12 固定小数点数と浮動小数点表現 6 5/19 計算アーキテクチャ
GPU GPU CPU CPU CPU GPU GPU N N CPU ( ) 1 GPU CPU GPU 2D 3D CPU GPU GPU GPGPU GPGPU 2 nvidia GPU CUDA 3 GPU 3.1 GPU Core 1
GPU 4 2010 8 28 1 GPU CPU CPU CPU GPU GPU N N CPU ( ) 1 GPU CPU GPU 2D 3D CPU GPU GPU GPGPU GPGPU 2 nvidia GPU CUDA 3 GPU 3.1 GPU Core 1 Register & Shared Memory ( ) CPU CPU(Intel Core i7 965) GPU(Tesla
Fortran 勉強会 第 5 回 辻野智紀
Fortran 勉強会 第 5 回 辻野智紀 今回のお品書き サブルーチンの分割コンパイル ライブラリ 静的ライブラリ 動的ライブラリ モジュール その前に 以下の URL から STPK ライブラリをインストールしておいて下さい. http://www.gfd-dennou.org/library/davis/stpk 前回参加された方はインストール済みのはず. サブルーチンの分割コンパイル サブルーチンの独立化
Microsoft PowerPoint - OS07.pptx
この資料は 情報工学レクチャーシリーズ松尾啓志著 ( 森北出版株式会社 ) を用いて授業を行うために 名古屋工業大学松尾啓志 津邑公暁が作成しました 主記憶管理 主記憶管理基礎 パワーポイント 27 で最終版として保存しているため 変更はできませんが 授業でお使いなる場合は松尾 ([email protected]) まで連絡いただければ 編集可能なバージョンをお渡しする事も可能です 復習 OS
2. OpenMP OpenMP OpenMP OpenMP #pragma#pragma omp #pragma omp parallel #pragma omp single #pragma omp master #pragma omp for #pragma omp critica
C OpenMP 1. OpenMP OpenMP Architecture Review BoardARB OpenMP OpenMP OpenMP OpenMP OpenMP Version 2.0 Version 2.0 OpenMP Fortran C/C++ C C++ 1997 10 OpenMP Fortran API 1.0 1998 10 OpenMP C/C++ API 1.0
PowerPoint プレゼンテーション
みんなの ベクトル計算 たけおか @takeoka PC クラスタ コンソーシアム理事でもある 2011/FEB/20 ベクトル計算が新しい と 2008 年末に言いました Intelに入ってる! (2008 年から見た 近未来? ) GPU 計算が新しい (2008 年当時 ) Intel AVX (Advanced Vector Extension) SIMD 命令を進めて ベクトル機構をつける
情報処理概論(第二日目)
情報処理概論 工学部物質科学工学科応用化学コース機能物質化学クラス 第 8 回 2005 年 6 月 9 日 前回の演習の解答例 多項式の計算 ( 前半 ): program poly implicit none integer, parameter :: number = 5 real(8), dimension(0:number) :: a real(8) :: x, total integer
連載講座 : 高生産並列言語を使いこなす (5) 分子動力学シミュレーション 田浦健次朗 東京大学大学院情報理工学系研究科, 情報基盤センター 目次 1 問題の定義 17 2 逐次プログラム 分子 ( 粒子 ) セル 系の状態 ステップ 18
連載講座 : 高生産並列言語を使いこなす (5) 分子動力学シミュレーション 田浦健次朗 東京大学大学院情報理工学系研究科, 情報基盤センター 目次 1 問題の定義 17 2 逐次プログラム 17 2.1 分子 ( 粒子 ) 17 2.2 セル 17 2.3 系の状態 18 2.4 1ステップ 18 2.5 力の計算 19 2.6 速度と位置の更新 20 2.7 セル間の分子の移動 21 3 OpenMP
CCS HPCサマーセミナー 並列数値計算アルゴリズム
大規模系での高速フーリエ変換 2 高橋大介 [email protected] 筑波大学計算科学研究センター 2016/6/2 計算科学技術特論 B 1 講義内容 並列三次元 FFT における自動チューニング 二次元分割を用いた並列三次元 FFT アルゴリズム GPU クラスタにおける並列三次元 FFT 2016/6/2 計算科学技術特論 B 2 並列三次元 FFT における 自動チューニング
コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n
コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n を入力してもらい その後 1 から n までの全ての整数の合計 sum を計算し 最後にその sum
gengo1-11
関数の再帰定義 自然数 n の階乗 n! を計算する関数を定義してみる 引数は整数 返却値も整数 n! = 1*2*3*... * (n 1)*n である ただし 0! = 1 とする int factorial(int n) int i, tmp=1; if( n>0 ) for(i=1; i
Microsoft PowerPoint - lec10.ppt
今日の内容, とポインタの組み合わせ, 例題 1. 住所録例題 2. と関数とは. を扱う関数. 例題 3. のリスト とポインタの組み合わせ 今日の到達目標 自分で を定義する 自分で定義したについて, 配列やポインタを作成する データ型 基本データ型 char 文字 (1 文字 ) int 整数 double 浮動小数など その他のデータ型配列 データの並び ( 文字列も, 文字の並び ) ポインタ
OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£²¡Ë
2013 5 30 (schedule) (omp sections) (omp single, omp master) (barrier, critical, atomic) program pi i m p l i c i t none integer, parameter : : SP = kind ( 1. 0 ) integer, parameter : : DP = selected real
Microsoft Word - matlab-coder-code-generation-quick-start-guide-japanese-r2016a
MATLAB コードを使用した C コードの生成クイックスタートガイド (R2016a) 最初のスタンドアロン C コードの生成 スタンドアロン C コードを生成するには [ ビルド ] を [ ソースコード ] [ スタティックライブラリ ] [ ダイナミックライブラリ ] または [ 実行ファイル ] のいずれかに切り替えます MATLAB Coder を使用することで MATLAB コードから
UNIX 初級講習会 (第一日目)
情報処理概論 工学部物質科学工学科応用化学コース機能物質化学クラス 第 3 回 2005 年 4 月 28 日 計算機に関する基礎知識 Fortranプログラムの基本構造 文字や数値を画面に表示する コンパイル時のエラーへの対処 ハードウェアとソフトウェア ハードウェア 計算, 記憶等を行う機械 ソフトウェア ハードウェアに対する命令 データ ソフトウェア ( 命令 ) がないとハードウェアは動かない
Microsoft PowerPoint - å®�æ−•試é¨fi3ㆮ対ç�Œ.pptx
C言語の繰り返し処理 for文と while文と do文 臼杵 潤 0) 準備 変数の加減算 int a, b=10; // a= a = 0; a = a+1; // a= a += 1; // a= // a= a ++; a = a + b; // a= a += b; // a= // a= a --; 下を1行ずつ実行すると それぞれ aの値はどう変わるか 0 1 2 3 13 23 22
<4D F736F F F696E74202D2091E63489F15F436F6D C982E682E992B48D8291AC92B489B F090CD2888F38DFC E B8CDD8
Web キャンパス資料 超音波シミュレーションの基礎 ~ 第 4 回 ComWAVEによる超高速超音波解析 ~ 科学システム開発部 Copyright (c)2006 ITOCHU Techno-Solutions Corporation 本日の説明内容 ComWAVEの概要および特徴 GPGPUとは GPGPUによる解析事例 CAE POWER 超音波研究会開催 (10 月 3 日 ) のご紹介
生成された C コードの理解 コメント元になった MATLAB コードを C コード内にコメントとして追加しておくと その C コードの由来をより簡単に理解できることがよくありま [ 詳細設定 ] [ コード外観 ] を選択 C コードのカスタマイズ より効率的な C コードを生成するベストプラクテ
MATLAB コードを使用した C コードの生成クイックスタートガイド (R2012a) 最初のスタンドアロン C コードの生成 スタンドアロン C コードを生成するには MATLAB Coder のペインを [ ビルド ] に切り替えて [C/C++ スタティックライブラリ ] [C/C++ ダイナミックライブラリ ] または [C/C++ 実行ファイル ] のいずれかを選択しま MATLAB Coder
FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作り
FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作ります FORTRAN の場合 OPEN 文でファイルを開いた後 標準入力の場合と同様に READ 文でデータを読みこみます
/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){
ソフトゼミ A 第 6 回 関数 プログラムは関数の組み合わせでできています 今までのゼミAでも printf や scanf など様々な関数を使ってきましたが なんと関数は自分で作ることもできるのです!! 今日は自作関数を中心に扱っていきます ゲーム制作でも自作関数は避けては通れないので頑張りましょう そもそもまず 関数とは 基本的には 受け取った値に関数によって定められた操作をして その結果の値を返す
