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

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

Microsoft Word - openmp-txt.doc

Microsoft PowerPoint - OpenMP入門.pptx

コードのチューニング

NUMAの構成

演習1: 演習準備

Microsoft PowerPoint - 03_What is OpenMP 4.0 other_Jan18

untitled

02_C-C++_osx.indd

openmp1_Yaguchi_version_170530

OpenMP 3.0 C/C++ 構文の概要

Microsoft PowerPoint - HPCseminar2013-msato.pptx

OpenMPプログラミング

GNU開発ツール

enshu5_4.key

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

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

01_OpenMP_osx.indd

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

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

Microsoft PowerPoint - 阪大CMSI pptx

untitled

POSIXスレッド

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

PowerPoint プレゼンテーション

Microsoft PowerPoint - 阪大CMSI pptx

NUMAの構成

Microsoft PowerPoint - compsys2-06.ppt

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

The 3 key challenges in programming for MC

Microsoft PowerPoint ppt [互換モード]

1.overview

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

POSIXプログラミング Pthreads編

I I / 47

HPC143

Microsoft PowerPoint - 09.pptx

プログラミングI第10回

Microsoft Word ●IntelクアッドコアCPUでのベンチマーク_吉岡_ _更新__ doc

GPU チュートリアル :OpenACC 篇 Himeno benchmark を例題として 高エネルギー加速器研究機構 (KEK) 松古栄夫 (Hideo Matsufuru) 1 December 2018 HPC-Phys 理化学研究所 共通コードプロジェクト

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

概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要.

untitled

Microsoft PowerPoint - sps14_kogi6.pptx

Slides: TimeGraph: GPU Scheduling for Real-Time Multi-Tasking Environments

プログラミング実習I

untitled

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx

PowerPoint プレゼンテーション

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

about MPI

スライド 1

スーパーコンピューティングニュース特集号 原稿

memo

Insert your Title here

Microsoft PowerPoint ppt [互換モード]

並列・高速化を実現するための 高速化サービスの概要と事例紹介

untitled

OpenMPプログラミング

memo

Taro-リストⅢ(公開版).jtd

TopSE並行システム はじめに

memo

Microsoft PowerPoint - 先端GPGPUシミュレーション工学特論(web).pptx

enshu5_6.key

Microsoft PowerPoint ppt [互換モード]

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

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

JavaプログラミングⅠ

PowerPoint プレゼンテーション

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

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

Microsoft PowerPoint - sales2.ppt

XcalableMP入門

新しい並列プログラミング言語である 分散メモリ環境において OpenMPのようにMPI とは異なるシンプルな言語構文と指示文による並列化を目指している ベース言語は Fortran 言語とC 言語となっており 2011 年 6 月に発足したPC クラスタコンソーシアム XcalableMP 規格部会

Microsoft PowerPoint - OS07.pptx

PowerPoint プレゼンテーション

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

1. GPU コンピューティング GPU コンピューティング GPUによる 汎用コンピューティング GPU = Graphics Processing Unit CUDA Compute Unified Device Architecture NVIDIA の GPU コンピューティング環境 Lin

04-process_thread_2.ppt

Java の ConcurrentHashMap における同期化 バッドケースとその対処法 2013 年 9 月湊隆行 1. はじめに表 1.1 に示すように Java の Collections Framework には 3 つの世代があります バージョン 1.0 から存在するレガシー API バ

Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, California 95054, U.S.A. All rights reserved. U.S. Government Rights - Commer

Slide 1

Microsoft PowerPoint - lec10.ppt

Slide 1

はじめに 誰? / hatena id:yohhoy 何を? C++11の 次 規格へ提案されている新機能の紹介 ちょっと (?) 未来 のお話です どうして? Google 先生に聞いても情報がほとんど無い... 勉強会駆動教えて君 2

スライド 1

Microsoft Word - 03

PowerPoint プレゼンテーション

memo

program7app.ppt

Slide 1

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

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

Microsoft PowerPoint ppt [互換モード]

IntelR Compilers Professional Editions

Microsoft PowerPoint - KHPCSS pptx

Microsoft Word - matlab-coder-code-generation-quick-start-guide-japanese-r2016a

RH850の割り込み/例外実現方法 CC-RHアプリケーションガイド

Transcription:

AICS 村井均 RIKEN AICS HPC Summer School 2012 8/7/2012 1

背景 OpenMP とは OpenMP の基本 OpenMP プログラミングにおける注意点 やや高度な話題 2

共有メモリマルチプロセッサシステムの普及 共有メモリマルチプロセッサシステムのための並列化指示文を共通化する必要性 各社で仕様が異なり 移植性がない そして いまやマルチコア プロセッサが主流となり そのような並列化指示文の重要性はさらに増している 3

スレッド の POSIX 標準 (pthreads ライブラリ ) スレッド とは? 一連のプログラムの実行を抽象化したもの 仮想的なプロセッサ と見なすこともできる 複数のスレッド間で資源 特に メモリ空間 を共有する点が プロセス とは異なる 通常 一つの共有メモリマルチプロセッサまたはコアに割り当てられる 複数のスレッドによる並列処理を明示的に記述する 他に コンパイラによる 自動並列化 を利用できる場合もある 4

共有メモリマルチプロセッサにおける並列プログラミングのためのモデル ベース言語 (Fortran/C/C++) を directive( 指示文 ) で並列プログラミングできるように拡張 米国コンパイラ関係の ISV を中心に仕様を決定 Oct. 1997 Fortran ver.1.0 API Oct. 1998 C/C++ ver.1.0 API 現在 OpenMP 3.0 URL http://www.openmp.org/ 日本語版の仕様書も公開されている 5

並列実行モデルへの API 従来の指示文は並列化コンパイラのための ヒント 科学技術計算が主なターゲット ( これまで ) 並列性が高い 95% の実行時間を占める (?)5% のコードを簡単に並列化する 共有メモリマルチプロセッサシステムがターゲット small-scale(~16 プロセッサ ) から medium-scale (~64 プロセッサ ) 6

int main(void) { for (t = 1; t < n_thd; t++) r = pthread_create(thd_main, t) thd_main(0); for (t =1; t < n_thd; t++) pthread_join(); } int s; /* global */ int n_thd; /* number of threads */ int thd_main(int id) { int c, b, e, i, ss; c = 1000 / n_thd; b = c * id; e = s + c; ss = 0; for(i = b; i < e; i++) ss += a[i]; pthread_lock(); s += ss; pthread_unlock(); return s; } 問題 :a[0]~a[999] の総和を求める 以下の全ての処理を明示しなければならない スレッドの生成 ループの担当部分の分割 足し合わせの同期 7

逐次プログラムに 指示行を追加するだけ! #pragma omp parallel for reduction(+:s) for(i = 0; i < 1000; i++) s+= a[i]; 8

新しい言語ではない コンパイラ指示文 実行時ライブラリルーチン 環境変数によりベース言語を拡張 ベース言語 :Fortran, C/C++ 自動並列化ではない 並列実行および同期をプログラマが明示する 指示文を無視すれば 逐次プログラムとして実行可 incremental な並列化 プログラム開発 デバックの面から実用的 逐次版と並列版を同じソースで管理ができる 9

背景 OpenMP とは OpenMP の基本 OpenMP プログラミングにおける注意点 やや高度な話題 10

fork-join モデル ただ一つのスレッドが実行を開始する parallel 構文の入口に遭遇したスレッド ( マスタスレッド ) は n 個のスレッドを生成し (fork) チームを構成する parallel 構文の出口で マスタスレッド以外のスレッドは消滅する (join) マスタスレッド fork チーム join parallel 構文 11

ワークシェアリング チームは ワークシェアリング構文に遭遇すると 指定された仕事を 分担して 実行する 並列処理 ループ (do/for), sections, single, workshare ワークシェアリング構文に遭遇しない限り チームの各スレッドは 仕事を 重複して 実行する 例. 仕事 1~100 を 4 スレッドで ワークシェア した結果 スレッド 0 は 仕事 1~25 スレッド 1 は 仕事 26~50 スレッド 2 は 仕事 51~75 スレッド 3 は 仕事 76~100 をそれぞれ実行する 12

特に指定のない限り 全てのスレッドはメモリ空間を共有する どのスレッドも どのデータをもアクセスできる 競合状態やコンシステンシを意識する必要がある ( 後述 ) いくつかの指示文または指示節によって あるデータのデータ共有属性を指定できる 例. int a, b; #pragma omp threadprivate (b) 全てのスレッドは 共有変数 a を読み書きできる 各スレッドは プライベート変数 b を持つ 13

ベース言語 Fortran コメントの形式!$omp directive-name [clause[[,] clause]...] ベース言語 Fortran プリプロセッサ指示の形式 #pragma omp directive-name [clause[[,] clause]...] 14

parallel リージョン = 複数のスレッド ( チーム ) によって並列実行される部分 を指定する リージョン内の各文 ( 関数呼び出しを含む ) を チーム内のスレッドが重複実行する Fortran:!$OMP PARALLEL parallel リージョン C/C++: #pragma omp parallel {!$OMP END PARALLEL } parallel リージョン 15

ループの各繰り返しを チーム内のスレッドが 分担して 実行することを指示する Fortran:!$OMP DO [clause]... DO i = 1, 100... END DO C/C++: #pragma omp for [clause]... for (i = 0; i < 100; i++) {... } 対象のループは 標準形 でなければならない clause で並列ループのスケジューリング データ属性を指定できる 16

17

#pragma omp parallel #pragma omp for private(i,j,sum) shared(a,b,c) for (i = 0; i < 8; i++) { sum = 0.0; for (j = 0; j < 8; j++) sum += b[i][j] * c[j]; a[i] = sum; } スレッド #0 スレッド #1 for (i = 0,1,2,3) {... } a i b c j = * j for (i = 4,5,6,7) {... } = * = * 18

19

スレッド数 4 の場合!$omp do schedule(static) デフォルト i = 1 100 #0 #1 #2 #3!$omp do schedule(static,n) コンパイル時に割り当てる ( 決定的 ) #0 #1 #2 #3 #0 #1 #2 #3 #0 #1 n!$omp do schedule(dynamic,n) 実行時に割り当てる ( 非決定的 ) #1 #3 #2 #0 #3 #2 #0 #1 #0 #2!$omp do schedule(guided,n) 実行時に割り当てる ( だんだん短くなる ) 20

shared(var_list) デフォルト 指定された変数は共有変数である ( スレッド間で共有される ) private(var_list) 指定された変数はプライベート変数である ( 各スレッドに固有である ) firstprivate(var_list) private と同様だが 直前の値で初期化される lastprivate(var_list) private と同様だが ワークシェアリング構文の終了時に 逐次実行された場合の値を反映する reduction(op:var_list) private と同様だが 構文の終了時に op で指定された方法で各変数を 集計 した結果 (e.g. 総和 最大値 ) を反映する 21

single 直後のブロックを 1 つのスレッドだけが実行する sections 複数のブロックを チーム内の各スレッドが分担して実行する 22

parallel 構文とワークシェアリング構文をまとめて指定するための ショートカット!$OMP PARALLEL!$OMP DO [clause]... DO i = 1, 100... END DO!$OMP END PARALLEL =!$OMP PARALLEL DO [clause]... DO i = 1, 100... END DO 23

背景 OpenMP とは OpenMP の基本 OpenMP プログラミングにおける注意点 やや高度な話題 24

OpenMP の共有メモリモデルでは 複数のスレッドが一つの共有変数を同時に書き換える = データ競合 複数のスレッドが一つの共有変数を同時に ( 順不同で ) 読み書きする という状況が起こり得る その場合の結果は不定である バグの温床 25

スレッド #0 スレッド #0 共有メモリ空間データ競合 n 共有メモリ空間 n? スレッド #1 スレッド #1 #pragma omp parallel shared(n) { n = omp_get_thread_num(); } omp_num_thread_num は 自スレッドの ID を返す関数 #pragma omp parallel shared(n) { n =...;... = n... } 26

バリア同期を行う チーム内の全スレッドが同期点に達するまで待つ それまでのメモリ書き込みも flush する parallel 構文とワークシェアリング構文の終わりでは 暗黙的にバリア同期が行われる S1; #pragma omp barrier S2; barrier S2 の実行時に S1 の処理が完了していることを保証する 27

parallel 構文とワークシェアリング構文に付随する暗黙のバリア同期を除去することにより 性能向上につながる場合がある #pragma omp for for (i = 0; i < N; i++) a[i] = b[i] + c[i]; 暗黙のバリア同期 #pragma omp for for (i = 0; i < N; i++) d[i] = a[i] + d[i]; #pragma omp for nowait for (i = 0; i < N; i++) a[i] = b[i] + c[i]; #pragma omp for nowait for (i = 0; i < N; i++) d[i] = e[i] + d[i]; 暗黙のバリア同期 28

master 直後のブロックを マスタ スレッドだけが実行する critical クリティカルセクション ( 同時に実行できない部分 ) flush メモリのフラッシュ threadprivate スレッドプライベート変数を宣言する 29

代表的な実行時ライブラリルーチン : int omp_get_num_threads(void) チーム内のスレッドの数を返す int omp_get_thread_num(void) 自スレッドの ID を返す void omp_set_lock(omp_lock_t *lock) ロック変数 lock が解放されるまで待つ void omp_unset_lock(omp_lock_t *lock) ロック変数 lock を解放する etc. 30

背景 OpenMP とは OpenMP の基本 OpenMP プログラミングにおける注意点 やや高度な話題 31

OpenMP 3.0 で タスク並列処理 のための機能が導入された それまでの OpenMP は 基本的にループを並列処理するための仕様だった 基本的な考え方 : あるスレッドが task 構文に遭遇すると そのコードブロックが タスク として登録される 登録されたタスクは チーム内のいずれかのスレッドによって いずれかのタイミングで実行される taskwait 構文または barrier 構文は 登録された全てのタスクの完了を待つ 32

線形リストの処理 #pragma omp parallel { #pragma omp single { node *p = head; while (p) { #pragma omp task process(p); p = p->next; } } } while 文の中で リストの各アイテムに対する処理の タスク を次々に生成 parallel リージョンの出口の暗黙のバリア同期において 全てのタスクの完了を待つ 33

マルチコアクラスタ とは? 各ノード (CPU) がマルチコアプロセッサであるクラスタ 現在のスーパーコンピュータの主流 ノード間 コア間の 2 種類の ( 階層的な ) 並列性を持つ ノード コア 34

フラット並列化各コアに MPI プロセスを割り当てる ハイブリッド並列化各 CPU に MPI プロセスを割り当て 各コアに OpenMP スレッドを割り当てる CPU コア MPI MPI MPI MPI OpenMP OpenMP MPI OpenMP OpenMP 35

ハイブリッド並列化の例 外側ループを MPI 並列化 MPI_Comm_size(MPI_COMM_WORLD, &size); X = N1 / size; for (i = 0; i < N1; i++) { #pragma omp parallel do for (j = 0; j < N2; j++)... 内側ループを OpenMP 並列化 36

ハイブリッド並列化の長所 データを共有できるため メモリを節約できる より多くの ( 異なるレベルの ) 並列性を利用できる ハイブリッド並列化の短所 プログラミングが難しい 必ずしも速くない ノード (CPU) が非常に多くなると 長所が短所を上回る? cf. 京速コンピュータ 京 では ハイブリッド並列化を推奨している 37

OpenMP の わかりやすさ ( 高い抽象性 ) は諸刃の剣 悪いプログラムも簡単に書けてしまう 性能の最後の一滴まで絞りつくすようなプログラムを書くのは難しい 特に NUMA 環境における不均一なメモリアクセスと false sharing の発生による性能低下には注意を要する ( が 発見も対処も簡単ではない ) とはいえ 16 並列くらいまでなら 多くの場合で特に問題なく使える 38

これからの高速化には 並列化は必須 16 並列ぐらいまでなら OpenMP 特にマルチコアプロセッサでは OpenMP が必須 16 並列以上になれば MPI( との併用 ) が必須 ただし プログラミングのコストと実行時間のトレードオフ 長期的には MPI に変わるプログラミング言語が待たれる 39