第87回openmp/openacc マルチコア・メニィコア並列プログラ...

110
87OpenMP/OpenACCによる マルチコア・メニィコア並列プログラミング 入門 星野哲也 ([email protected]) 東京大学情報基盤センター 2017/11/1 ()

Upload: others

Post on 12-Sep-2019

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

第87回OpenMP/OpenACCによるマルチコア・メニィコア並列プログラミング

入門

星野哲也 ([email protected])東京大学情報基盤センター

2017/11/1(水)

Page 2: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

スケジュール(11月1日)• 13:00– 14:30

– GPUについて• GPUのアーキテクチャ• GPUプログラミングで気をつけるべきこと

– OpenACC• OpenMPとOpenACCの違い• OpenACCの指示文• アプリケーションのOpenACC化

• 14:45-17:30(適宜休憩)– ずっと実習

• コンパイラメッセージの見方、実行の仕方• ICCGソルバーのOpenACC化

マルチコア・メニィコア並列プログラミング入門 2

Page 3: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

GPUのアーキテクチャGPUプログラミングで気をつけるべきこと

3

GPUについて

Page 4: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

Reedbush-Hノードのブロック図

マルチコア・メニィコア並列プログラミング入門 4

NVIDIAPascal

NVIDIAPascal

NVLinK20 GB/s

IntelXeonE5-2695v4(Broadwell-

EP)

NVLinK20 GB/s

QPI76.8GB/s

76.8GB/s

IBFDRHCA

G3x16

15.7 GB/s 15.7 GB/s

DDR4���

128GB

EDRswitch

EDR

76.8GB/s 76.8GB/s

IntelXeonE5-2695v4

(Broadwell-EP)QPIDDR4DDR4DDR4

DDR4DDR4DDR4DDR4

���

128GB

PCIe swG3

x16

PCIe sw

G3

x16

G3

x16

IBFDRHCA

Page 5: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

GPUって何?

• GPU:GraphicsProcessingUnit– いわゆるグラフィックボード(グラボ)、ビデオカード

• 画像処理に特化したハードウェア– 高速・高解像度描画、3D描画処理(透視変換、陰影・照明)、画面出力

– ノートPC、ゲームハード、スマホなどに搭載

• GPUを汎用計算に用いる手法をGPGPU、GPUコンピューティングなどと呼ぶ

マルチコア・メニィコア並列プログラミング入門 5

Page 6: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

なぜGPUコンピューティング?

P100 BDW KNL

動作周波数(GHz) 1.480 2.10 1.40

コア数(有効スレッド数) 3,584 18(18) 68(272)

理論演算性能(GFLOPS) 5,304 604.8 3,046.4

主記憶容量(GB) 16 128 16

メモリバンド幅(GB/sec.,Stream Triad) 534 65.5 490

備考 Reedbush-HのGPU Reedbush-U/HのCPU

Oakforest-PACSのCPU(IntelXeonPhi)

マルチコア・メニィコア並列プログラミング入門 6

• 性能が高いから!

Page 7: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

GPUプログラミングは何が難しい?

• CPU:大きなコアをいくつか搭載– Reedbush-Hの CPU:2.10GHz18コア– 大きなコア…分岐予測、パイプライン処理、Out-of-Order

• 要はなんでもできる– 逐次の処理が得意

• GPU:小さなコアをたくさん搭載– Reedbush-Hの GPU: 1.48GHz3,584コア– 小さなコア...上記機能が弱いまたはない!– 並列処理が必須

マルチコア・メニィコア並列プログラミング入門 7

GPUの難しさ1. 多数のコアを効率良く扱う難しさ2. 並列プログラミング自体の難しさ

Page 8: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

参考:NVIDIATeslaP100

マルチコア・メニィコア並列プログラミング入門 8

• 56SMs• 3584CUDA

Cores• 16GBHBM2

P100whitepaperより

Page 9: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

参考:NVIDIATeslaP100の SM

マルチコア・メニィコア並列プログラミング入門 9

Page 10: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

参考:NVIDIA社のGPU• 製品シリーズ

– GeForce• コンシューマ向け。安価。

– Tesla• HPC向け。倍精度演算器、大容量メモリ、ECCを備えるため高価。

• アーキテクチャ(世代)1. Tesla: 初のHPC向けGPU、TSUBAME1.2など2. Fermi:2世代目、TSUBAME2.0など

• ECCメモリ、FMA演算、L1L2キャッシュ3. Kepler:現在HPCにて多く利用、TSUBAME2.5など

• シャッフル命令、DynamicParallelism、Hyper-Q4. Maxwell:コンシューマ向けのみ5. Pascal: 新GPU、Reedbush-Hに搭載

• HBM2、半精度演算、 NVLink、倍精度atomicAddなど6. Volta:次世代GPU

• TensorCoreなど

10マルチコア・メニィコア並列プログラミング入門

Page 11: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

押さえておくべきGPUの特徴

• CPUと独立のGPUメモリ• 性能を出すためにはスレッド数>>コア数• 階層的スレッド管理と同期• Warp単位の実行• やってはいけないWarp内分岐• コアレスドアクセス

マルチコア・メニィコア並列プログラミング入門 11

Page 12: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

CPUと独立のGPUメモリ

• 計算はCPUから始まる• 物理的に独立のデバイスメモリとデータのやり取り必須

マルチコア・メニィコア並列プログラミング入門 12

CPU

メインメモリ

GPU

~200GB/s ~1,000GB/s

~32GB/s

デバイスメモリ

バス (PCIeなど)

OSが動いている OSは存在しない

2.計算を行う

1.必要なデータを送る

3.計算結果を返す

~20GB/s

ノードの外へ

Page 13: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

性能を出すためにはスレッド数>>コア数• 推奨スレッド数

– CPU: スレッド数=コア数 (高々数十スレッド)– GPU: スレッド数>=コア数*4~(数万~数百万スレッド)

• 適値は他のリソースとの兼ね合いによる

• 理由:高速コンテキストスイッチによるメモリレイテンシ隠し– CPU:レジスタ・スタックの退避はOSがソフトウェアで行う(遅い)– GPU:ハードウェアサポートでコストほぼゼロ

• メモリアクセスによる暇な時間(ストール)に他のスレッドを実行

マルチコア・メニィコア並列プログラミング入門 13

1core=1スレッドのとき

メモリread開始 メモリread終了

1core=Nスレッドのとき

Page 14: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

階層的スレッド管理と同期

• 階層的なコア/スレッド管理– P100は56SMを持ち、1SMは64CUDA

coreを持つ。トータル3584CUDAcore– 1SMが複数のスレッドブロックを担当し、

1CUDAcoreが複数スレッドを担当

• スレッド間の同期– 同一スレッドブロック内のスレッドは同期できる

– 異なるスレッドブロックに属するスレッド間は同期できない

• 同期するためにはGPUの処理を終了する必要あり

• atomic演算は可能

マルチコア・メニィコア並列プログラミング入門 14

citedfrom:http://cuda-programming.blogspot.jp/2012/12/thread-hierarchy-in-cuda-programming.html

スレッドブロック

Page 15: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

Warp単位の実行• 連続した32スレッドを1単位 =Warpと呼ぶ• このWarpは足並み揃えて動く

– 実行する命令は32スレッド全て同じ– データは違ってもいい

マルチコア・メニィコア並列プログラミング入門 15

4 3 5 … 8 0スレッド 1 2 3 … 31 32

配列 A

配列 B 2 3 1 … 1 9

× × × … × ×

4 3 5 … 8 0スレッド 1 2 3 … 31 32

配列 A

配列 B 2 3 1 … 1 9

÷ × + … − ×

OK! NG!

Page 16: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

やってはいけないWarp内分岐• DivergentBranch

– Warp内で分岐すること。Warp単位の分岐ならOK。

マルチコア・メニィコア並列プログラミング入門 16

::

if( TRUE){::

}else{::

}::

::

if(奇数スレッド ){::

}else{::

}::

一部スレッドを眠らせて全分岐を実行悪ケースでは32倍のコスト

else部分は実行せずジャンプ

Page 17: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

コアレスドアクセス

• 同じWarp内のスレッドが近いアドレスに同時にアクセスするのがメモリの性質上効率的

– これをコアレスドアクセス(coalescedaccess)と呼ぶ

マルチコア・メニィコア並列プログラミング入門 17

32回のメモリアクセスが行われる

メモリアクセスが1回で済む。

デバイスメモリ

スレッド 1 2 3 4 … 32…

スレッド 1 2 3 4 … 32

128バイト単位でメモリアクセス。Warp内のアクセスが128バイトに収まってれば1回。外れればその分だけ繰り返す。 悪ケースでは32倍のコスト

Page 18: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

ストライドアクセスがあるとどうなるか

• GPUはストライドアクセスに弱い!

18

0

100

200

300

400

500

600

0 20 40 60 80 100 120 140

Mem

oryBa

ndwidth[G

B/sec]

Stride

voidAoS_STREAM_Triad(STREAM_TYPEscalar){ssize_t i,j;#pragmaomp parallelforprivate(i,j)#pragmaacc kernelspresent(a_aos[0:STREAM_ARRAY_SIZE]¥

,b_aos[0:STREAM_ARRAY_SIZE],c_aos[0:STREAM_ARRAY_SIZE])#pragmaacc loopgangvectorindependentfor(j=0;j<STREAM_ARRAY_SIZE/STRIDE;j++)for(i=0;i<STRIDE;i++)a_aos[j*STRIDE+i]=b_aos[j*STRIDE+i]+scalar*c_aos[j*STRIDE+i];

}

ストライドアクセス付き streamtriad

Page 19: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

19

OpenACCOpenMPとOpenACCの違いOpenACCの指示文アプリケーションのOpenACC化

Page 20: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

GPUを利用する方法

• GPU対応ライブラリ– ライブラリを呼び出すだけ– ライブラリとして存在するもののみ

• OpenACC– 既存のC/C++/Fortranプログラムに指示文を入れるだけ

– 細かいチューニングは不可• CUDA

– 自由度が も高い

– プログラムの大幅な書き換えを必要とする

20

本講習会の主な対象

簡単

難しい

Page 21: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

OpenACC

• OpenACCとは…アクセラレータ(GPUなど)向けのOpenMPのようなもの

– 既存のプログラムのホットスポットに指示文を挿入し、計算の重たい部分をアクセラレータにオフロード

– 対応言語: C/C++,Fortran

• 指示文ベース– 指示文:コンパイラへのヒント– 記述が簡便,メンテナンスなどをしやすい

– コードの可搬性(portability)が高い• 対応していない環境では無視される

GPUプログラミング入門 21

#pragmaacckernelsfor(i =0;i<N;i++){….

}

!$acckernelsdoi =1,N….

enddo!$accendkernels

C/C++

Fortran

Page 22: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

OpenACC

• 規格– 各コンパイラベンダ(PGI, Crayなど)が独自に実装していた拡張を統合し共通規格化 (http://www.openacc.org/)

– 2011年秋にOpenACC1.0 新の仕様はOpenACC 2.5

• 対応コンパイラ– 商用:PGI,Cray,PathScale

• PGIは無料版も出している

– 研究用:Omni(AICS),OpenARC (ORNL),OpenUH (U.Houston)– フリー:GCC6.x

• 開発中 (開発状況: https://gcc.gnu.org/wiki/Offloading)• 実用にはまだ遠い

マルチコア・メニィコア並列プログラミング入門 22

本講習会ではPGIコンパイラを用いる

Page 23: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

OpenACCと OpenMPの実行イメージ比較

マルチコア・メニィコア並列プログラミング入門 23

OpenACC

デバイスCPU

OpenMP

CPU

1スレッド

CPU

int main(){

#pragma…for(i =0;i<N;i++){

}

}

Page 24: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

OpenACCと OpenMPの比較

マルチコアCPU環境

MEMORY

計算コア

計算コア

計算コア

計算コア

計算コア

計算コア

計算コア

計算コア

OpenMPの想定アーキテクチャ

24

CPU(s)

• 計算コアがN個– N < 100程度 (XeonPhi除く)

• 共有メモリ

一番の違いは対象アーキテクチャの複雑さ

Page 25: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

• 計算コアN個をM階層で管理– N>1000を想定– 階層数Mはアクセラレータによる

• ホスト-デバイスで独立したメモリ

– ホスト-デバイス間データ転送は低速

アクセラレータを備えた計算機環境

MEMORY(ホスト)

CPU(s)

MEMORY(デバイス)

OpenACCと OpenMPの比較

OpenACCの想定アーキテクチャ

25一番の違いは対象アーキテクチャの複雑さ

Page 26: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

OpenACCと OpenMPの比較• OpenMPと同じもの

– Fork-Joinという概念に基づくループ並列化• OpenMPになくてOpenACCにあるもの

– ホストとデバイスという概念• ホスト-デバイス間のデータ転送

– 多階層の並列処理• OpenMPにあってOpenACCにないもの

– スレッドIDを用いた処理など• OpenMPのomp_get_thread_num()に相当するものが無い

• その他、気をつけるべき違い– OpenMPと比べてOpenACCは勝手に行うことが多い

• 転送データ、並列度などを未指定の場合は勝手に決定

26マルチコア・メニィコア並列プログラミング入門

Page 27: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

OpenACCと OpenMPの比較デフォルトでの変数の扱い

• OpenMP– 全部 shared

• OpenACC– スカラ変数: firstprivate orprivate– 配列: shared

• プログラム上のparallel/kernels構文に差し掛かった時、OpenACCコンパイラは実行に必要なデータを自動で転送する

• 正しく転送されないこともある。自分で書くべき• 構文に差し掛かるたびに転送が行われる(非効率)。後述のdata指示文を用いて自分で書くべき

• 配列はデバイスに確保される (shared的振る舞い)• 配列変数をprivateに扱うためには private指示節使う

マルチコア・メニィコア並列プログラミング入門 27

Page 28: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

GPUプログラミング難易度早見表(私見)

OpenACCwithUnifiedMemory

マルチコア・メニィコア並列プログラミング入門 28

OpenACC OpenMP

omp paralleldo書くだけ

OpenACCwithデータ指示文

カーネルのCUDA化

OpenACCのカーネルチューニング

データマネージメントの壁

スレッド制御の壁

intrinsicを用いたSIMD化

指示文を用いたSIMD化

Page 29: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

OpenACCの指示文

マルチコア・メニィコア並列プログラミング入門 29

Page 30: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

OpenACCの主要な指示文

• 並列領域指定指示文– kernels,parallel

• データ移動 適化指示文

– data,enterdata,exitdata,update

• ループ 適化指示文

– loop

• その他、比較的よく使う指示文– host_data,atomic,routine,declare

マルチコア・メニィコア並列プログラミング入門 30

Page 31: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

並列領域指定指示文

• 1,2,3全てを行う指示文

マルチコア・メニィコア並列プログラミング入門 31

ホスト

メインメモリ

デバイス

~200GB/s ~1,000GB/s

~32GB/s

デバイスメモリ

2.計算を行う

1.必要なデータを送る

3.計算結果を返す

Page 32: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

並列領域指定指示文:parallel, kernels

• アクセラレータ上で実行すべき部分を指定– OpenMPのparallel指示文に相当

• 2種類の指定方法:parallel,kernels– parallel:(どちらかというと)マニュアル

• OpenMPに近い• 「ここからここまでは並列実行領域です。並列形状などはユーザー側で指定します」

– kernels:(どちらかというと)自動的• 「ここからここまではデバイス側実行領域です。あとはお任せします」

– 細かい指示子・節を加えていくと 終的に同じような挙動にな

るので、どちらを使うかは好み

• 個人的にはkernels推奨

32マルチコア・メニィコア並列プログラミング入門

Page 33: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

kernels/parallel指示文kernels

programmain

!$acckernelsdoi =1,N!loopbody

enddo!$accendkernels

endprogram

parallel

programmain

!$accparallelnum_gangs(N)!$accloopgangdoi =1,N!loopbody

enddo!$accendparallel

endprogram

マルチコア・メニィコア並列プログラミング入門 33

Page 34: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

kernels/parallel指示文kernels

programmain

!$acckernelsdoi =1,N!loopbody

enddo!$accendkernels

endprogram

parallel

programmain

!$accparallelnum_gangs(N)!$accloopgangdoi =1,N!loopbody

enddo!$accendparallel

endprogram

マルチコア・メニィコア並列プログラミング入門 34

ホスト側 デバイス側

• ホスト-デバイスを意識するのがkernels

• 並列実行領域であることを意識するのがparallel

「並列数はデバイスに合わせてください」 「並列数Nでやってください」

Page 35: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

kernels/parallel指示文:指示節kernels• async• wait• device_type• if• default(none)• copy…

parallel• async• wait• device_type• if• default(none)• copy…• num_gangs• num_workers• vector_length• reduction• private• firstprivate

マルチコア・メニィコア並列プログラミング入門 35

Page 36: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

kernels/parallel指示文:指示節kernels parallel

• async• wait• device_type• if• default(none)• copy…• num_gangs• num_workers• vector_length• reduction• private• firstprivate

マルチコア・メニィコア並列プログラミング入門 36

parallelでは並列実行領域であることを意識するため、並列数や変数の扱いを決める指示節がある。

非同期実行に用いる。

実行デバイス毎にパラメータを調整

データ指示文の機能を使える

Page 37: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

kernels/parallel実行イメージFortran C言語

マルチコア・メニィコア並列プログラミング入門 37

subroutinecopy(dis,src)real(4),dimension(:) ::dis,src

!$acc kernelscopy(src,dis)doi =1,Ndis(i)=src(i)

enddo!$accendkernels

endsubroutinecopy

voidcopy(float*dis,float*src){int i;

#pragmaacc kernelscopy(src[0:N]¥dis[0:N])for(i =0;i<N;i++){dis[i]=src[i];

}

}

Page 38: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

kernels/parallel実行イメージFortran

マルチコア・メニィコア並列プログラミング入門 38

subroutinecopy(dis,src)real(4),dimension(:) ::dis,src

!$acc kernelscopy(src,dis)doi =1,Ndis(i)=src(i)

enddo!$accendkernels

endsubroutinecopy

(ホスト) (デバイス)

dis,src ⓪dis,srcの領域が確保される

①dis,srcの値がコピーされる

dis_dev,src_dev

dis’_dev,src’_devdis’,src’

③dis’_dev,src’_devの値がコピーされる

④dis,srcの領域が解放される

②デバイス

上の計算

Page 39: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

デバイス上で扱われるべきデータについて

• プログラム上のparallel/kernels構文に差し掛かった時、OpenACCコンパイラは実行に必要なデータを自動で転送する– 正しく転送されないこともある。自分で書くべき– 構文に差し掛かるたびに転送が行われる(非効率)。後述の

data指示文を用いて自分で書くべき– 自動転送はdefault(none)で抑制できる

• スカラ変数は firstprivateとして扱われる– 指示節により変更可能

• 配列はデバイスに確保される (shared的振る舞い)– 配列変数をスレッドローカルに扱うためには privateを指定する

マルチコア・メニィコア並列プログラミング入門 39

Page 40: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

データ移動 適化指示文

• 1,3を 適化するための指示文

• ただしデータの一貫性を維持するのはユーザの責任

マルチコア・メニィコア並列プログラミング入門 40

ホスト

メインメモリ

デバイス

~200GB/s ~1,000GB/s

~32GB/s

デバイスメモリ

2.計算を行う

1.必要なデータを送る

3.計算結果を返す

Page 41: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

データ移動 適化指示文:data, enter/exit data

• デバイス側で必要なデータと範囲を指定– Allocate,Memcpy,Deallocateを行う

• data指示文 (推奨)– Allocate+Memcpy (H⇄ D)+Deallocate– 構造ブロックに対してのみ適用可

• コードの見通しが良い• enter data指示文

– Allocate+Memcpy (H→D)– exitdataとセット。構造ブロック以外にも使える

• exitdata指示文– Memcpy (H←D)+Deallocate– enterdataとセット。構造ブロック以外にも使える

マルチコア・メニィコア並列プログラミング入門 41

Page 42: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

データ移動 適化指示文が必要なとき

Fortran C言語

マルチコア・メニィコア並列プログラミング入門 42

subroutinecopy(dis,src)real(4),dimension(:) ::dis,srcdoj=1,M

!$acc kernelscopy(src,dis)doi =1,Ndis(i)=dis(i)+src(i)

enddo!$accendkernelsenddo

endsubroutinecopy

voidcopy(float*dis,float*src){int i,j;for(j=0;j<M;j++){

#pragmaacc kernelscopy(src[0:N]¥dis[0:N])for(i =0;i<N;i++){dis[i]=dis[i]+src[i];

}}

}Kernelsをループで囲むとどうなるか…

Page 43: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

for(j=0;j<M;j++){

}

データ移動 適化指示文が必要なとき

C言語

マルチコア・メニィコア並列プログラミング入門 43

voidcopy(float*dis,float*src){int i,j;for(j=0;j<M;j++){

#pragmaacc kernelscopy(src[0:N]¥dis[0:N])for(i =0;i<N;i++){dis[i]=dis[i]+src[i];

}}

}Kernelsをループで囲むとどうなるか…

ホスト

メインメモリ

デバイス

~200GB/s ~1,000GB/s

~32GB/s

デバイスメモリ

2.計算を行う

1.必要なデータを送る

3.計算結果を返す

1,2,3全てが繰り返される!

Page 44: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

data指示文Fortran C言語

マルチコア・メニィコア並列プログラミング入門 44

subroutinecopy(dis,src)real(4),dimension(:) ::dis,src

!$acc datacopy(src,dis)doj=1,M

!$acc kernelspresent(src,dis)doi =1,Ndis(i)=dis(i)+src(i)

enddo!$accendkernelsenddo

!$acc enddataendsubroutinecopy

voidcopy(float*dis,float*src){int i,j;

#pragmaacc datacopy(src[0:N]¥dis[0:N]){for(j=0;j<M;j++){

#pragmaacc kernelspresent(src,dis)for(i =0;i<N;i++){dis[i]=dis[i]+src[i];

}}}

}Cの場合、data指示文の範囲は{}で指定(この場合はforが構造ブロックになってるのでなくても大丈夫だが)

present:既に転送済であることを示す(OpenACC2.5の仕様以降、copyはpresent_or_copyとして扱われることになったので、実は書き換えなくても大丈夫になった。)

Page 45: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

data指示文C言語

マルチコア・メニィコア並列プログラミング入門 45

voidcopy(float*dis,float*src){int i,j;

#pragmaacc datacopy(src[0:N]¥dis[0:N]){for(j=0;j<M;j++){

#pragmaacc kernelspresent(src,dis)for(i =0;i<N;i++){dis[i]=dis[i]+src[i];

}}}

}Cの場合、data指示文の範囲は{}で指定(この場合はforが構造ブロックになってるのでなくても大丈夫だが)

ホスト

メインメモリ

デバイス

~200GB/s ~1,000GB/s

~32GB/s

デバイスメモリ

2.計算を行う

1.必要なデータを送る

3.計算結果を返す

2のみが繰り返される!

for(j=0;j<M;j++){

}

Page 46: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

enterdata,exit data指示文

マルチコア・メニィコア並列プログラミング入門 46

voidmain(){double*q;int step;for(step=0;step<N;step++){if(step==0)init(q);solverA(q);solverB(q);….if(step==N)fin(q);

}}

voidinit(double*q){q=(double*)malloc(sizeof(double)*M);q=…;//初期化

#pragmaaccenterdatacopyin(q[0:M])}

voidfin(double*q){#pragmaaccexitdatacopyout(q[0:M])print(q);//結果出力free(q);

}

Page 47: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

data,enter/exitdata指示文の指示節data• if• copy• copyin• copyout• create• present• present_or_...• deviceptr

– CUDAなどと組み合わせる時に利用。cudaMallocなどで確保済みのデータを指定し、OpenACCで扱い可とする

enterdata• if• async• wait• copyin• create• present_or_...

マルチコア・メニィコア並列プログラミング入門 47

exitdata• if• async• wait• copyout• delete

非同期転送用

Page 48: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

data,enter/exitdata指示文の指示節• copy

– allocate,memcpy (H→D),memcpy (D→H),deallocate• copyin

– allocate,memcpy (H→D),deallocate 結果の出力を行わない• copyout

– allocate,memcpy (D→H),deallocate データの入力を行わない• create

– allocate,deallocateコピーは行わない• present

– 何もしない。既にデバイス上にあることを教える• present_or_copy/copyin/copyout/create (省略形:pcopy)

– デバイス上になければ copy/copyin/copyout/createする。あれば何もしない

48

ただしOpenACC2.5以降では、copy,copyin,copyoutの挙動はpcopy,pcopyin,pcopyoutと同一

マルチコア・メニィコア並列プログラミング入門

Page 49: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

データ移動指示文:データ転送範囲指定

• 送受信するデータの範囲の指定– 部分配列の送受信が可能– 注意:FortranとCで指定方法が異なる

• 二次元配列Aを転送する例

49

!$acc data copy(A(lower1:upper1, lower2:upper2) )…

!$acc end data

Fortran版

C版 #pragma acc data copy(A[start1:length1][start2:length2])…

#pragma acc end data

fortranでは下限と上限を指定

Cでは先頭と長さを指定

マルチコア・メニィコア並列プログラミング入門

Page 50: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

データ移動指示文:update指示文• データ指示文などで既にデバイス上に確保済みのデータを対象とする

– Memcpy (H⇄ D)の機能を持っていると思えば良い

マルチコア・メニィコア並列プログラミング入門 50

update• if• async• wait• device_type• self#hostと同義• host # H←D• device# H→D

!$accdatacopy(A(:,:))dostep=1,N…!$accupdatehost(A(1:2,:))callcomm_boundary(A)!$accupdatedevice(A(1:2,:))…enddo!$accenddata

Page 51: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

ループ 適化指示文

• 2の 適化を行う指示文

マルチコア・メニィコア並列プログラミング入門 51

ホスト

メインメモリ

デバイス

~200GB/s ~1,000GB/s

~32GB/s

デバイスメモリ

2.計算を行う

1.必要なデータを送る

3.計算結果を返す

Page 52: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

階層的並列モデルとループ指示文

• OpenACCではスレッドを階層的に管理– gang, worker, vectorの3階層– gang:workerの塊一番大きな単位– worker:vectorの塊– vector:スレッドに相当する一番小さい処理単位

• loop指示文– parallel/kernels中のループの扱いについて指示

• パラメータの設定はある程度勝手にやってくれる

– 粒度(gang,worker,vector)の指定– ループ伝搬依存の有無の指定

52

!$acckernels!$accloopgangdoj=1,n

!$accloopvectordoi=1,ncc=0

!$accloop seqdok=1,ncc=cc+a(i,k)*b(k,j)

enddoc(i,j)=cc

enddoenddo

!$accendkernels

GPUでの行列積の例

マルチコア・メニィコア並列プログラミング入門

Page 53: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

階層的並列モデルとアーキテクチャ

• OpenMPは1階層– マルチコアCPUも1階層– 近は2階層目(SIMD)がある

• CUDAは blockと threadの2階層– NVIDAGPUも2階層

• 1SMXに複数CUDAcoreを搭載• 各コアはSMXのリソースを共有

• OpenACCは3階層– 様々なアクセラレータに対応するため

53

• NVIDIA GPUの構成

53

GPU

デバイスメモリ

SMX

CUDAコア

マルチコア・メニィコア並列プログラミング入門

Page 54: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

ループ指示文:指示節

loop• collapse• gang• worker• vector• seq• auto• tile• device_type• independent• private• reduction

マルチコア・メニィコア並列プログラミング入門 54

Page 55: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

ループ指示文:指示節

loop• collapse• gang• worker• vector• seq• auto• tile• device_type• independent• private• reduction

マルチコア・メニィコア並列プログラミング入門 55

!$acckernels!$accloopcollapse(3) gangvectordok=1,10doj =1,10doi =1,10

….

enddoenddo

enddo!$accendkernels

3つのループが一重化される

並列化するにはループ長の短すぎるループに使う

Page 56: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

ループ指示文:指示節

loop• collapse• gang• worker• vector• seq• auto• tile• device_type• independent• private• reduction

マルチコア・メニィコア並列プログラミング入門 56

!$acckernels!$accloopgang(N)dok=1,N

!$accloopworker(1)doj =1,N

!$accloopvector(128)doi =1,N

….

!$acckernels!$accloopgang vector(128)doi =1,N

….

vectorはworkerより内側workerはgangより内側

ただし1つのループに複数つけるのはOK

数値の指定は難しいので、 初はコンパイラ任せでいい

Page 57: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

ループ指示文:指示節

loop• collapse• gang• worker• vector• seq• auto• tile• device_type• independent• private• reduction

マルチコア・メニィコア並列プログラミング入門 57

doj =1,Ndoi=1,NidxI(i)=i;idxJ(j)=j

enddoenddo

!$acckernels&!$acc&copyin(A,idxI,idxJ)copyout(B)!$accloopindependent gangdoj =1,N!$accloopindependent vector(128)doi=1,NB(idxI(i),idxJ(j))=alpha *A(i,j)

enddoenddo!$accendkernels

Bに間接参照→

OpenACCコンパイラは保守的。依存関係が生じそうなら並列化しない。きちんと並列化されているかどうか、必ずコンパイラのメッセージを確認する。(やり方は後述)

Page 58: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

ループ指示文:指示節

loop• collapse• gang• worker• vector• seq• auto• tile• device_type• independent• private• reduction

マルチコア・メニィコア並列プログラミング入門 58

!$acckernels&!$accloopreduction(+:val)doi =1,Nval =val +1

enddo!$accendkernels

利用できる演算子(OpenACC2.0仕様書より)

簡単なものであれば、PGIコンパイラは自動でreductionを入れてくれる

acc reduction (+:val)

演算子

対象とする変数制限:スカラー変数のみ

Page 59: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

参考:リダクションでOpenACCが好きになる

• そもそもリダクションって?

マルチコア・メニィコア並列プログラミング入門 59

1 2 3 4 5 6 7 8 9

sum=0.0for(i =0;i<N;i++)

sum+=array[i]

リダクションが必要な例

スレッド1 スレッド2 スレッド3

6 15 24

6 15 24

45

array

sum=

1.各スレッドが担当領域で縮約

2.一時配列に書き込む

3.一時配列を縮約

Page 60: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

参考:リダクションでOpenACCが好きになる

マルチコア・メニィコア並列プログラミング入門 60

int main(int argc,char*argv[]){….double*tmp,*ans_d;cudaMalloc((void**)&tmp,sizeof(double)*896);cudaMalloc((void**)&ans_d,sizeof(double)*1);

int chunk=(N+895)/896;dim3dimGrid_L(896,1,1);dim3dimBlock_L(128,1,1);dim3dimGrid_G(1,1,1);dim3dimBlock_G(1024,1,1);

reduction_L <<<dimGrid_L,dimBlock_L>>>(N,A_d,tmp,chunk);reduction_G <<<dimGrid_G,dimBlock_G>>>(tmp,ans_d);

cudaMemcpy(&sum,ans_d,sizeof(double),cudaMemcpyDeviceToHost);….}

__global__voidreduction_L(int N,double*A,double*tmp,int chunk){__shared__doublesum_tmp[4];int tx =threadIdx.x; int bx =blockIdx.x;int st =bx*chunk+tx; int en =min(N,(bx+1)*chunk);doublesum=0.0;for(i =st;i <en;i+=128)sum+=A[i];sum+=__shfl_xor(sum,16); sum+=__shfl_xor(sum,8);sum+=__shfl_xor(sum,4); sum+=__shfl_xor(sum,2);sum+=__shfl_xor(sum,1);if(tx %32==0) sum_tmp[tx/32]=sum;__syncthreads();if(tx ==0)tmp[bx]=sum+sum_tmp[1]+sum_tmp[2]+sum_tmp[3];}

__global__voidreduction_G(double*tmp,double*ans){__shared__doublesum_tmp[32];doublesum;int tx =threadIdx.x;if(tx >=896)sum=0.0;elsesum=tmp[tx];sum+=__shfl_xor(sum,16); sum+=__shfl_xor(sum,8);sum+=__shfl_xor(sum,4); sum+=__shfl_xor(sum,2);sum+=__shfl_xor(sum,1);if(tx %32==0) sum_tmp[tx/32]=sum;__syncthreads();if(tx <32){sum=sum_tmp[tx];sum+=__shfl_xor(sum,16); sum+=__shfl_xor(sum,8);sum+=__shfl_xor(sum,4); sum+=__shfl_xor(sum,2);sum+=__shfl_xor(sum,1);}__syncthreads();if(tx ==0)ans[0]=sum;}

• CUDAで実装しようと思うと…– 全部自分でやる– これはshuffle機能を使ったリダクション

ホスト側プログラム

GPUカーネル1

GPUカーネル2

一時配列の確保

使用するスレッド数の宣言

GPUカーネル呼び出し

結果の書き戻し

Warpshuffle機能を使ったWarp内の縮約

sharedmemoryを使ったWarp間の縮約syncthreads()による同期必須

一時配列も同様に縮約

Page 61: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

参考:リダクションでOpenACCが好きになる

• OpenACCなら…

マルチコア・メニィコア並列プログラミング入門 61

sum=0.0#pragmaacc kernelscopyin(A[0:N])#pragmaacc loopreduction(+:sum)for(i =0;i<N;i++){

sum+=array[i]}

1. reductionacc time : 0.00148(s)2. copyback andCPUtime: 0.63831(s)3. cuda 1threadtime : 9.63381(s)4. reductioncuda time : 0.00140(s)

• 性能も…1. OpenACCのリダクション2. 一旦CPUに書き戻して1スレッドで計算3. CPUに書きもどさず、GPUの1スレッドで計算4. CUDAの shuffleを使ったリダクション

array(倍精度)のサイズ100000000の時 (Fortran)

下手なプログラムを書くくらいならOpenACCに任せた方が速い!

これだけ!

Page 62: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

関数呼び出し指示文:routine

• parallel/kernels領域内から関数を呼び出す場合、routine指示文を使う

マルチコア・メニィコア並列プログラミング入門 62

#pragmaaccroutinevectorexterndoublevecsum(double*A);…#pragmaaccparallelnum_gangs(N)vector_length(128)for(int i =0;i<N;i++){max=vecsum(A[i*N]);

}

#pragmaaccroutinevectordoublevecsum(double*A){doublex=0;

#pragmaaccloopreduction(+:x)for(int j = 0;j < N;j++){

x+=A[j];}returnx;

}

プロトタイプ宣言にもつける

Page 63: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

host_data指示文• OpenACCのデータ指示文を使うと…

マルチコア・メニィコア並列プログラミング入門 63

(ホスト) (デバイス)

dis,src

subroutinecopy(dis,src)real(4),dimension(:)::dis,src

!$acc datacopy(src,dis)!--------------------------!CPU上の処理!--------------------------callhoge(dis,src)

!$acc kernelspresent(src,dis)doi =1,Ndis(i)=dis(i)+src(i)

enddo!$acc endkernels

!$acc enddataendsubroutinecopy

dis_dev,src_dev

①両方に作られる

②並列領域以外ではホスト側が使われる

関数にもホスト側のアドレスが渡る

③並列領域ではデバイス側が使われる

デバイス側のアドレスを渡したい時は??

Page 64: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

host_data指示文• 並列領域の外でデバイス側のアドレスを使うための指示文

– データ指示文で確保済の配列が対象• デバイス側のアドレスを使いたいケースって?

– CUDAで書いた関数の呼び出し– GPU用のライブラリの呼び出し– GPUDirectによるMPI通信

• GPUDirect: ホスト側のメモリを介さず、GPU間で直接MPIによるデータ通信をするもの

マルチコア・メニィコア並列プログラミング入門 64

!$accdatacreate(tmp)copy(val) copyin(A)...

!$acchost_datause_device(A,tmp,val)callreduction_cuda_shuffle(val,N,A,tmp)

!$accendhost_data...

!$accenddata

領域内ではデバイス側のアドレスが使われる

#pragmaaccdatacreate(tmp[0:896])copy(val){...

#pragmaacchost_datause_device(A,tmp,val){reduction_cuda_shuffle(&val,N,A,tmp);}...}

Fortran C

Page 65: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

atomic指示文• 並列化領域内で、どうしても並列化できない部分が存在する場合に使う

– 全体的には並列に計算できるが、書き込み先が衝突するようなケース

• PascalGPUは倍精度のatomicAddをハードウェアサポートしてるので、それなりに速い

マルチコア・メニィコア並列プログラミング入門 65

!$acckernelsasync(0)!$accloopindependentgangvector

dok=inls,inlei=IAL(k)X1=Xin(3*i-2)X2=Xin(3*i-1)X3=Xin(3*i )WVAL1=AL(k,1)*X1+AL(k,2)*X2+AL(k,3)*X3WVAL2=AL(k,4)*X1+AL(k,5)*X2+AL(k,6)*X3WVAL3=AL(k,7)*X1+AL(k,8)*X2+AL(k,9)*X3i=INL_G(k)

!$accatomictmpL(i,1)=tmpL(i,1)+WVAL1

!$accendatomic!$accatomic

tmpL(i,2)=tmpL(i,2)+WVAL2!$accendatomic!$accatomic

tmpL(i,3)=tmpL(i,3)+WVAL3!$accendatomic

enddo!$accendkernels

一文ずつ囲む

iが関節参照なので、書き込み先が衝突する可能性がある

Page 66: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

OpenACCと UnifiedMemory

• UnifiedMemoryとは…– 物理的に別物のCPUとGPUのメモリをあたかも一つのメモリのように扱う機能

– PascalGPUではハードウェアサポート• ページフォルトが起こると勝手にマイグレーションしてくれる

• OpenACCと UnifiedMemory– OpenACCにUnifiedMemoryを直接使う機能はない

• PGIコンパイラではオプションを与えることで使える• pgfortran –acc –ta=tesla,managed

– 使うとデータ指示文が無視され、代わりにUnifiedMemoryを使う

マルチコア・メニィコア並列プログラミング入門 66

Page 67: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

UnifiedMemoryのメリット・デメリット

• メリット– データ移動の管理を任せられる– 複雑なデータ構造を簡単に扱える

• 本来はメモリ空間が分かれているため、ディープコピー問題が発生する

マルチコア・メニィコア並列プログラミング入門 67

!$acckernels!$accloopindependentdoil=1,kt!$accloopindependentdoit=1,ndt;itt=it+nstrtt-1zbu(il)=zbu(il)+st_leafmtxp%st_lf(ip)%a1(it,il)*zu(itt)enddoenddo!$accendkernels

• デメリット– ページ単位で転送するため、細かい転送が必要な場合には遅くなる– CPU側のメモリ管理を監視しているので、allocate,deallocateを繰り返すアプリではCPU側が極端に遅くなる• 今研究で使っているコードでは20倍近く遅くなった

↑こう書くだけで正しく動くのは、従来のCUDAユーザーからすると革命的

Page 68: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

アプリケーションの移植方法

マルチコア・メニィコア並列プログラミング入門 68

Page 69: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

アプリケーションのOpenACC化手順1. プロファイリングによるボトルネック部位の導出2. ボトルネック部位のOpenACC化

1. 並列化可能かどうかの検討2. (OpenACCの仕様に合わせたプログラムの書き換え)3. parallel/kernels指示文適用

3. data指示文によるデータ転送の 適化

4. OpenACCカーネルの 適化

1~ 4を繰り返し適用。それでも遅ければ、

5. カーネルのCUDA化– スレッド間の相互作用が多いアプリケーションでは、sharedmemoryや shuffle命令を自由に使えるCUDAの方が圧倒的に有利

マルチコア・メニィコア並列プログラミング入門 69

Page 70: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

既にOpenMP化されているアプリケーションのOpenACC化手順

1. !$omp parallelを!$acc kernelsに機械的に置き換え2. (UnifiedMemoryを使い、とりあえずGPU上で実行)

– 本講習会では扱いません3. データ指示文を用いて転送の 適

4. コンパイラのメッセージを見ながら、OpenACCカーネルの適化

5. カーネルのCUDA化など– スレッド間の相互作用が多いアプリケーションでは、shared

memoryや shuffle命令を自由に使えるCUDAの方が圧倒的に有利

マルチコア・メニィコア並列プログラミング入門 70

Page 71: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

データ指示文による 適化手順

マルチコア・メニィコア並列プログラミング入門 71

main

sub1 sub3sub2

subBsubA

int main(){doubleA[N];sub1(A);sub2(A);sub3(A);

}

sub2(doubleA){subA(A);subB(A);

}

subA(doubleA){

for(i =0~N){…

}}

葉っぱの部分からOpenACC化を始める

ホスト デバイス

Page 72: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

データ指示文による 適化手順

マルチコア・メニィコア並列プログラミング入門 72

main

sub1 sub3sub2

subBsubA

int main(){doubleA[N];sub1(A);sub2(A);sub3(A);

}

sub2(doubleA){subA(A);subB(A);

}

subA(doubleA){#pragma acc …for(i =0~N){…

}}

subA

この状態でも必ず正しい結果を得られるように作る!この時、速度は気にしない!

ホスト デバイス

data指示文で配列Aをコピー

Page 73: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

データ指示文による 適化手順

マルチコア・メニィコア並列プログラミング入門 73

main

sub1 sub3sub2

subBsubA

int main(){doubleA[N];sub1(A);

#pragma acc data{sub2(A);

}sub3(A);

}

sub2(doubleA){subA(A);subB(A);

}

subA(doubleA){#pragma acc …for(i =0~N){…

}}

subA

徐々にデータ移動を上流に移動する

ホスト デバイス

data指示文で配列Aをコピーsub2

subB

Page 74: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

データ指示文による 適化手順

マルチコア・メニィコア並列プログラミング入門 74

main

sub1 sub3sub2

subBsubA

int main(){doubleA[N];

#pragma acc data{sub1(A);sub2(A);sub3(A);

}}

sub2(doubleA){subA(A);subB(A);

}

subA(doubleA){#pragma acc …for(i =0~N){…

}}

subA

ここまで来たら、ようやく個別のカーネルの 適化を始める。※データの転送時間が相対的に十分小さくなればいいので、かならずしも 上流までやる必要はない

ホスト デバイス

sub2

subB

main

sub1 sub3

data指示文で配列Aをコピー

Page 75: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

OpenACCの適用例上で説明した指示文を用いてOpenACC化したもの

75

Page 76: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

OpenACCを用いたICCG法ソルバーのPascalGPUにおける性能評価

星野哲也・大島聡史・塙敏博・中島研吾・伊田明弘1) 東京大学情報基盤センター・ 先端共同HPC基盤施設(JCAHPC)

2) 第158回 HPC研究会@熱海

とKNL

Page 77: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

メニーコアプロセッサと消費電力

P100

P100

KNL

KNL

KNL

KNL

KNL

KNL

PEZY

Sunway

• Green500Top10(2016/11)は全部メニーコア

• メニーコア向けのアルゴリズムや 適化手法の開発が重要

77

Page 78: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

本研究の概要

• 研究目的– 新世代のGPU,XeonPhiである、P100とKNLの性能評価

• 評価手法– OpenACC,OpenMPにより並列化したICCG法ソルバーを使用– P100とKNLの性能を比較– 前世代 (Kepler,KNC)と比較– それぞれへの 適化の適用

• 成果– P100において、指示文の 適化などにより1.21倍の性能向上を達成– KNLにおいて、同期の削減などにより1.20倍の性能向上を達成

78

Page 79: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

発表概要

• 研究背景• 対象アプリケーション• ICCG法・行列格納手法• OpenACCによる並列化• P100vsKNL(vsBDW,K20,KNC)• P100・KNL向け 適化

• まとめ・今後の課題

79

Page 80: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

• 有限体積法,一様場ポアソン方程式ソルバー– [大島他 SWoPP 2014], [中島 HPC-139], [中島 HPC-147],[中島 HPC-157]– 差分格子:データ構造は非構造,7点ステンシル,問題サイズ1283

– 対称正定な疎行列を係数とする連立一次方程式– ICCG法,上下三角成分を別々に格納

• 色付け・リオ-ダリング– CM-RCM+Coalesced/Sequential

• 行列格納手法– CRS,Sliced-ELL,Sell-C-σ

80

x

yz

NXNY

NZ DZ

DXDY

x

yz

x

yz

NXNY

NZ DZ

DXDY

DZ

DXDY

DXDY

対象アプリケーション

Page 81: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

ICCG法

• 共役勾配法(ConjugateGradient,CG)

• 前処理– 不完全コレスキー分解

(IncompleteCholeskyFactorization,IC)

– 並列化にはカラーリングが必要

Compute r(0)= b-[A]x(0)

for i= 1, 2, …solve [M]z(i-1)= r(i-1)

ri-1= r(i-1) z(i-1)if i=1p(1)= z(0)

elsebi-1= ri-1/ri-2p(i)= z(i-1) + bi-1 p(i-1)

endifq(i)= [A]p(i)

ai = ri-1/p(i)q(i)x(i)= x(i-1) + aip(i)r(i)= r(i-1) - aiq(i)check convergence |r|

end

81

Page 82: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

ICCG法並列化:データ依存性の解決

• 「色づけ+リオ-ダリング」による並列性抽出• 同色内は並列に実行可能• 色数 →収束性 並列性 同期コスト

82

64 63 61 58 54 49 43 36

62 60 57 53 48 42 35 28

59 56 52 47 41 34 27 21

55 51 46 40 33 26 20 15

50 45 39 32 25 19 14 10

44 38 31 24 18 13 9 6

37 30 23 17 12 8 5 3

29 22 16 11 7 4 2 1

64 63 61 58 54 49 43 36

62 60 57 53 48 42 35 28

59 56 52 47 41 34 27 21

55 51 46 40 33 26 20 15

50 45 39 32 25 19 14 10

44 38 31 24 18 13 9 6

37 30 23 17 12 8 5 3

29 22 16 11 7 4 2 1

1 17 3 18 5 19 7 20

33 49 34 50 35 51 36 52

17 21 19 22 21 23 23 24

37 53 38 54 39 55 40 56

33 25 35 26 37 27 39 28

41 57 42 58 43 59 44 60

49 29 51 30 53 31 55 32

45 61 46 62 47 63 48 64

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

RCMReverseCuthill-Mckee

MC(Color#=4)Multicoloring

CM-RCM(Color#=4)CyclicMC+RCM

48 32

31 15

14 62

61 44

43 26

25 8

7 54

53 36

16 64

63 46

45 28

27 10

9 56

55 38

37 20

19 2

47 30

29 12

11 58

57 40

39 22

21 4

3 50

49 33

13 60

59 42

41 24

23 6

5 52

51 35

34 18

17 1

Page 83: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

83

64 63 61 58 54 49 43 36

62 60 57 53 48 42 35 28

59 56 52 47 41 34 27 21

55 51 46 40 33 26 20 15

50 45 39 32 25 19 14 10

44 38 31 24 18 13 9 6

37 30 23 17 12 8 5 3

29 22 16 11 7 4 2 1

64 63 61 58 54 49 43 36

62 60 57 53 48 42 35 28

59 56 52 47 41 34 27 21

55 51 46 40 33 26 20 15

50 45 39 32 25 19 14 10

44 38 31 24 18 13 9 6

37 30 23 17 12 8 5 3

29 22 16 11 7 4 2 1

1 17 3 18 5 19 7 20

33 49 34 50 35 51 36 52

17 21 19 22 21 23 23 24

37 53 38 54 39 55 40 56

33 25 35 26 37 27 39 28

41 57 42 58 43 59 44 60

49 29 51 30 53 31 55 32

45 61 46 62 47 63 48 64

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

RCMReverseCuthill-Mckee

MC(Color#=4)Multicoloring

CM-RCM(Color#=4)CyclicMC+RCM

48 32

31 15

14 62

61 44

43 26

25 8

7 54

53 36

16 64

63 46

45 28

27 10

9 56

55 38

37 20

19 2

47 30

29 12

11 58

57 40

39 22

21 4

3 50

49 33

13 60

59 42

41 24

23 6

5 52

51 35

34 18

17 1

RCM● 収束性良❌並列性悪、同期コスト高

MC●並列性良❌悪条件問題に弱い

CM-RCM●並列性・収束性本発表で使用

ICCG法並列化:データ依存性の解決

Page 84: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

Coalesced,Sequentialオーダリング

色順に並べ替えた後、

• Coalesced– データの順はそのまま– 各スレッドは不連続なメモリアクセス

• Sequential– データ順を再オーダリング

– 計算単位(スレッドやコア)内で連続アクセス

84

color=1 color=2 color=3 color=4 color=5Coloring(5 colors)+Ordering

color=1 color=2 color=3 color=4 color=5Coloring(5 colors)+Ordering

color=1 color=2 color=3 color=4 color=5

1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8

2 2 2 2 22 2 2 2 2 3 3 3 3 33 3 3 3 3 4 4 4 4 4 5 5 5 5 5 6 6 6 6 6 7 7 7 7 7 8 8 8 8 84 4 4 4 44 4 4 4 4 5 5 5 5 55 5 5 5 5 6 6 6 6 66 6 6 6 6 7 7 7 7 77 7 7 7 7 8 8 8 8 88 8 8 8 81 1 1 1 11 1 1 1 1

Initial Vector

各スレッド上で各スレッド上で不連続なメモリ不連続なメモリアクセス(色のアクセス(色の順に番号付け)順に番号付け)

スレッド内で連続に番号付けスレッド内で連続に番号付け

Initial Vector

color=1 color=2 color=3 color=4 color=5Coloring(5 colors)+Ordering

color=1 color=2 color=3 color=4 color=5

1 2 3 4 5 6 7 81 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8

Sequential

Coalesced

Page 85: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

85

CRS ELL SlicedELL SELL-C-s(SELL-2-8)

Cs

一番一般的な格納方法

0でpadding

非零要素数でソート。複数配列で表現することで無駄な計算を削減

行列格納方法CをSIMD長等に合わせ、適宜0paddingで整形

Page 86: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

実施ケース

略称 Numbering 格納形式

c-CRS Coalesced CRSc-Sliced-ELL Sliced-ELL(ブロッキングあり)c-SELL-C-σ SELL-C-σs-CRS Sequential CRSs-Sliced-ELL Sliced-ELL(ブロッキングあり)s-SELL-C-σ SELL-C-σ

カラーリングはいずれもCM-RCM問題サイズは1283

86

Page 87: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

OpenACC/OpenMP実装

• 同一ソースコードにそれぞれの指示文を挿入– HPC157から、不要な一時配列の除去などの 適化

– HPC157から、一部 適化を評価のため除外(OpenMP)

!$omp parallel do private(... )!$acc kernels!$acc loop independent gang

do ip= 1, PEsmpTOTip1=(ip-1)*NCOLORtot + ic

!$omp simd!$acc loop independent vector

do i= index(ip1-1)+1, index(ip1)…

enddoenddo

!$omp end parallel do!$acc end kernels

87

• OpenACC– 全並列化ループに !$acc kernelsを適用– データ転送は計測外で行う– 予稿から 適化レベルを1段階ダウン

• async指示節を除外

• OpenMP– 全並列化ループに !$omp paralleldoを適用

Page 88: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

Hardware

• P100:NVIDIATeslaP100(予稿はPCI-E版)– Reedbush-H

• K20:NVIDIATeslaK20Xm– TSUBAME2.5

• KNC:IntelXeonPhi5110P(KnightsCorner)– KNSC

• KNL:IntelXeonPhi7250(KnightsLanding)– Oakforest-PACS

• BDW:IntelXeonE5-2695v4(IntelBroadwell-EP)– Reedbush-U

88

Page 89: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

Hardwarespec

略 称 P100 K20 KNL KNC BDW

動作周波数(GHz) 1.480 0.732 1.40 1.053 2.10

コア数( 大有効スレッド数)

1,792 896 68(272) 60(240) 18(18)

理論演算性能(GFLOPS) 5,304 1,311.7 3,046.4 1,010.9 604.8

主記憶容量(GB) 16 6 16 8 128

メモリバンド幅(GB/sec.,StreamTriad)

534 179 490 159 65.5

System Reedbush-H TSUBAME2.5 Oakforest-PACS KNSC Reedbush-U

89

Page 90: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

コンパイラ・環境変数P100• コンパイラ&オプション

– pgfortran 17.1(予稿は16.10)– -O3–ta=tesla:cc60

• 環境変数– 特になし

90

Page 91: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

コンパイラ・環境変数KNL• コンパイラ&オプション

– ifort (IFORT)17.0.020160721– -alignarray64byte-O3-xMIC-AVX512-qopenmp -qopt-streaming-

stores=always-qopt-streaming-cache-evict=0• ただしCRSを使うときは-qopt-streaming-stores=never(予稿ではalways)

• 環境変数– exportOMP_STACKSIZE=1G– ulimit -s1000000– 66スレッドの時

• exportOMP_NUM_THREADS=66• exportKMP_AFFINITY=granularity=fine,proclist=[2-67],explicit

– 132/198/264スレッドの時• exportOMP_NUM_THREADS=132/198/264• exportKMP_AFFINITY=compact• exportKMP_HW_SUBSET=66c@2,2t/3t/4t

その他・numactl –membind=1でMCDRAMを使用・メモリモデル:Flat・サブNUMAモード:Quadrant

91

Page 92: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

P100

• Coalesced版が速い• Sell-C-σ(C=64,σ=1)と

Sliced-ELLが同程度で速

• CRSが3割程度遅い• 色数6程度が 速

– 原因:同期コスト(カーネル呼び出し)

– 予稿と違うのはasync外したため

92

0.5

0.6

0.7

0.8

0.9

1.0

1.1

2 4 6 8 10 12 14 16 18 20

Elapsedtim

e[sec]

Color#c-CRS c-Sliced-ELL c-SELL-64-1 s-CRS s-Sliced-ELL s-SELL-64-1

Page 93: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

0.5

0.7

0.9

1.1

1.3

1.5

1.7

1.9

2.1

2.3

2.5

2 4 6 8 10 12 14 16 18 20

Elapsedtim

e[sec]

Color#c-CRS c-Sliced-ELL c-SELL-8-1 s-CRS s-Sliced-ELL s-SELL-8-1

KNL

• Sequential版が速い• Sell-C-σ(C=8,σ=1)が

• CRSが2.5倍程度遅い• 色数14程度が 速

• 66/132/198/264スレッド中 66スレッドが速

93

Page 94: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

各プロセッサの性能比較

• 各プロセッサ 速の疎行列形状の結果

• K20vsKNC– KNCが1.57倍も遅い

• P100vsKNL– KNLが1.10倍しか遅くない

• P100vsK20– P100はK20の2.71倍程度

94

0.0

0.5

1.0

1.5

2.0

2.5

3.0

3.5

4.0

4.5

2 4 6 8 10 12 14 16 18 20

Elapsedtim

e[sec]

Color#P100 K20 KNL KNC BDW

BDW

KNC

K20

KNL

P100

Page 95: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

実行効率 (vs.BDW)

• 色数10の時の比較

• メモリバンド幅X倍で性能もX倍になると仮定すると、P100・KNLの実行効率はBDWの61%程度

95

略 称 P100 K20 KNL KNC BDWメモリバンド幅(GB/sec.,StreamTriad)

534 179 490 159 65.5

相対メモリバンド幅

8.152 2.733 7.481 2.427 1

実行時間 0.6448 1.714 0.7061 2.708 3.224

相対性能 5.00 1.88 4.57 1.19 1

(相対性能)/(相対メモリバンド幅) 0.613 0.688 0.610 0.490 1

Page 96: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

適化(OpenACC)

1. Baseline– 全並列ループに!$acc kernels

2. Async (予稿のBaseline)– !$acc kernelsを !$acc kernelsasync(0)と置き換え

3. Thread– gang,vectorなどのパラメータを調整

4. Fusion– SPMV部分のカーネルを融合

96

↑指示文のみの変更

↓コードの変更

Page 97: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

適化 3Thread

• リダクション部分のスレッド数を調整

– 目的:ローカルリダクションで生成される一時配列のサイズを小さくする

• デフォルト設定– ローカルリダクション

• gang=(N-1)/128+1• vector=128

– グローバルリダクション• gang=1• vector=256

97

!$ompparalleldoprivate(i)reduction(+:RHO)!$acckernelsasync(0)!$accloopindependentgang(448)vectorreduction(+:RHO)

doi=1,NRHO=RHO+W(i,R)*W(i,Z)

enddo!$accendkernels

← 16384要素の一時配列ができ、その配列を1gangでリダクション

↑448要素の一時配列ができ、その配列を1gangでリダクション

Page 98: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

適化 4Fusion

• カーネルを融合し、呼び出しコストを削減

• SpMV部分では、色1,色2~N-1,色Nの時で処理内容が異なる– 色2~N-1のカーネルをN-2回呼び出す

• 色2~N-1の処理を、複数のカーネルから1カーネルに融合

98

!C!CSpMV!C

doic =1,NCOLORtot !色ループif(ic ==1)then

!色1の時の処理

elseif(2<=ic,ic <NCOLORtot)then

!色2~色NCOLORtot-1の時の処理

else

!色NCOLORtotの時の処理

endifenddo

Page 99: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

P100 適化結果

• asyncの効果大– カーネル起動オーバーヘッドを隠せる

• Baselineから1.21倍の性能向上

• BDW比実行効率61.3%→74.5%

99

0.50

0.55

0.60

0.65

0.70

0.75

2 4 6 8 10 12 14 16 18 20

Elapsedtim

e[sec]

Color#

1Baseline 2Async 3Thread 4Fusion

Page 100: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

適化(OpenMP)1. Baseline

– 全並列ループに !$omp paralleldo2. mvparallel1

– !$omp parallelを色ループの外に3. nowait

– !$omp enddonowaitを使う(SpMV部分)4. mvparallel2

– !$omp parallelを収束判定ループの外に5. rmompdo

– !$omp doを使わず自力で(機械的に)ループ分割 (reduction以外)6. rmreduction

– reductionを自分で書く7. loopschedule

– ループスケジューリングの変更100

↑指示文のみの変更

↓コードの変更

Page 101: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

Move!$omp paralell

doL=1,ITR!収束判定ループ

doic=1,NCOLORtot!色ループ!$ompparalleldo

do...enddo

!$ompendparalleldoenddo

enddo

Baseline

doL=1,ITR!収束判定ループ

!$ompparallel

doic=1,NCOLORtot!色ループ

!$ompdo

do...

enddo

!$ompenddo

enddo

!$ompendparallel

enddo

2mvparallel 4mvparallel!$ompparallel

doL=1,ITR!収束判定ループ

doic=1,NCOLORtot!色ループ

!$ompdo

do...

enddo

!$ompenddo

enddo

enddo

!$omp endparallel

Page 102: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

ループスケジューリング

!$ompdodoi=1,NW(i)=....

enddo!$ompenddo!この後、W(i)を前進後退代入の入力!として使う

Baselineip =omp_get_thread_num()+1

nth=omp_get_num_threads()

ls =(N+nth-1)/nth

doi=(ip-1)*ls+1,min(ip*ls,N)

W(i)=....

enddo

!$ompbarrier

5rmompdo 7loopscheduling

doi=自スレッドの担当部分

W(i)=....

enddo

!バリアはいらない

color=1 color=2 color=3 color=4 color=5Coloring(5 colors)+Ordering

color=1 color=2 color=3 color=4 color=5Coloring(5 colors)+Ordering

color=1 color=2 color=3 color=4 color=5

1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8

2 2 2 2 22 2 2 2 2 3 3 3 3 33 3 3 3 3 4 4 4 4 4 5 5 5 5 5 6 6 6 6 6 7 7 7 7 7 8 8 8 8 84 4 4 4 44 4 4 4 4 5 5 5 5 55 5 5 5 5 6 6 6 6 66 6 6 6 6 7 7 7 7 77 7 7 7 7 8 8 8 8 88 8 8 8 81 1 1 1 11 1 1 1 1

Initial Vector

各スレッド上で各スレッド上で不連続なメモリ不連続なメモリアクセス(色のアクセス(色の順に番号付け)順に番号付け)

スレッド内で連続に番号付けスレッド内で連続に番号付け

Sequential

• 5rmompdo• 自力で機械的にstatic分割

• 7loopscheduling• リオーダリングの知識を使い、前進後退代入などと同一領域を担当

Page 103: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

!$ompparallelprivate(i,ALPHA,C1,....)

ip =omp_get_thread_num()+1

nth=omp_get_num_threads()

ls =(N+nth-1)/nth

...

C1S(ip)=0.0d0

doi=(ip-1)*ls+1,min(ip*ls,N)

C1S(ip)=C1S(ip)+W(i,P)*W(i,Q)

enddo

C1=0.d0

!$ompbarrier

doi=1,PEsmpTOT

C1=C1+C1S(i)

enddo

ALPHA=RHO/C1

C1=0.d0

!$ompdoreduction(+:C1)

doi=1,N

C1=C1+W(i,P)*W(i,Q)

enddo

!$ompenddo

ALPHA=RHO/C1

自力リダクション

• オリジナルはバリア2回• ローカルリダクションとグローバルリダクションの間

• !$omp enddoの時• nowaitは不可

• バリア1回• 各自グローバルリダクション

103

Page 104: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

適化(OpenMP)1. Baseline2. mvparallel13. nowait4. mvparallel25. rmompdo6. rmreduction7. loopschedule

1 2 3 4 5 6 7

parallel do 40 5 5 0 0 0 0

parallel 0 3 3 0 0 0 0

do 0 35 23 28 3 0 0

do(nowait)

0 0 12 12 0 0 0

reductionclause

3 3 3 3 3 0 0

barrier(explicit)

0 0 0 1 26 29 26

barrier(implicit)

43 46 34 31 6 0 0

barrier(合計)

43 46 34 32 32 29 26

1イテレーションあたりのOMP指示文数 (12色の時)

104

終的に、1回の!$omp parallelと!$ompbarrierだけのプログラムになる

Page 105: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

KNL 適化結果

• !$omp parallelの移動、バリアフリーどちらも効果大

– KNLのバリアは遅い?

• Baselineから1.20倍の性能向上

• BDW比実行効率61.0%→70.0%

105

0.55

0.60

0.65

0.70

0.75

0.80

0.85

2 4 6 8 10 12 14 16 18 20

Elapsedtim

e[sec]

Color#1Baseline 2mvparallel1 3nowait4mvparallel2 5rmompdo 6rmreduction

Page 106: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

バリアフリーの効果(KNL,KNC)

106

0.0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8KNL#ofcolor=15#ofthread=66

0.0

0.5

1.0

1.5

2.0

2.5

3.0KNC#ofcolor=13#ofthread=120

Elapsedtim

e

Elapsedtim

e

27.2%18.1%

Page 107: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

3.120

3.125

3.130

3.135

3.140

3.145

3.150

3.155

3.160

3.165

3.170

3.175 BDW#ofcolor=20#ofthread=18

バリアフリーの効果(BDW)

107

Elapsedtim

e

0ではない

1.0%• BDWではほとんど効果が得られない

– 外に!$omp parallelを追いやることで1.0%性能向上

– “7”では”4”から0.3%性能低下

Page 108: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

P100vsKNL

• バンド幅比を考えると同程度

– P100:534GB/s– KNL:490GB/s

108

0.0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

2 4 6 8 10 12 14 16 18 20

Elapsedtim

e[sec]

Color#P100 KNL

Page 109: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

まとめ• ICCGソルバーにより、P100・KNLを評価• P100

– OpenACCの async節を適切につけることが必須• CUDAはdefaultで非同期

– 指示文の 適化などにより1.21倍の高速化• KNL

– バリアフリー化が効果大– 一連の 適化により1.20倍の高速化

• 計算速度の向上、コアの増加による相対的な同期コスト増により、バリアフリー化が重要– ただし、既存のCPUで性能低下を引き起こす可能性あり

• 今後の課題– MPIなどの通信を含むアプリケーションでの評価– 演算律速なアプリケーションでの評価– 同期コストについての詳細な評価

109

Page 110: 第87回OpenMP/OpenACC マルチコア・メニィコア並列プログラ …nkl.cc.u-tokyo.ac.jp/seminars/multicore/oacc-05.pdf · のがメモリの性質上効率的 –これをコアレスドアクセス(coalesced

Q&A

110