Microsoft PowerPoint - OpenMP入門.pptx

Similar documents
NUMAの構成

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 \215u\213`4\201i\221\272\210\344\201j.pptx)

演習1: 演習準備

Microsoft Word - openmp-txt.doc

02_C-C++_osx.indd

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

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

enshu5_4.key

Microsoft PowerPoint - 03_What is OpenMP 4.0 other_Jan18

OpenMPプログラミング

Microsoft PowerPoint - 阪大CMSI pptx

プログラミング実習I

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

Microsoft PowerPoint - prog03.ppt

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

C

NUMAの構成

about MPI

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

Microsoft PowerPoint - 阪大CMSI pptx

スライド 1

プログラミング入門1

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

openmp1_Yaguchi_version_170530

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

The 3 key challenges in programming for MC

Microsoft PowerPoint - lec10.ppt

memo

PowerPoint プレゼンテーション

memo

Insert your Title here

cp-7. 配列

Microsoft PowerPoint - compsys2-06.ppt

数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留

Microsoft PowerPoint - 第3回目.ppt [互換モード]

プログラミングI第10回

Microsoft PowerPoint - prog04.ppt

PowerPoint プレゼンテーション

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

Microsoft PowerPoint - kougi7.ppt

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

スライド 1

memo

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

Microsoft PowerPoint - 11.pptx

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

並列計算導入.pptx

プログラミング入門1

Microsoft Word - no12.doc

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

01_OpenMP_osx.indd

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

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

COMET II のプログラミング ここでは機械語レベルプログラミングを学びます 1

演習準備

memo

C C UNIX C ( ) 4 1 HTML 1

Microsoft PowerPoint - ca ppt [互換モード]

POSIXスレッド

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

1.overview

JavaプログラミングⅠ

スライド 1

Microsoft PowerPoint - kougi6.ppt

Microsoft PowerPoint - 高速化WS富山.pptx

Microsoft PowerPoint ppt [互換モード]

2. OpenMP におけるキーワード一覧 OpenMP の全体像を理解するために 指示文 指示節 実行時ライブラリ関数 環境変数にそれぞれどうようなものがあるのかを最初に示します 各詳細については第 4 章以降で説明します 2.1 OpenMP の指示文 OpenMPの指示文は プログラム内で並列

JavaプログラミングⅠ

Microsoft PowerPoint ppt [互換モード]

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

Microsoft PowerPoint ppt

slide5.pptx

プログラミング基礎

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

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

Microsoft PowerPoint ppt

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

TopSE並行システム はじめに

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

PowerPoint プレゼンテーション

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

プログラミングA

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

Microsoft PowerPoint - OS07.pptx

XcalableMP入門

kiso2-09.key

講習No.10

Class Overview

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

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

本文ALL.indd

Taro-再帰関数Ⅲ(公開版).jtd

enshu5_6.key

Microsoft PowerPoint - prog03.ppt

* ライブラリ関数 islower(),toupper() を使ったプログラム 1 /* 2 Program : trupper.c 3 Student-ID : K 4 Author : TOUME, Kouta 5 Comments : Used Library function i

Microsoft PowerPoint - 09.pptx

JavaプログラミングⅠ

Transcription:

OpenMP 入門 須田礼仁 2009/10/30 初版

OpenMP 共有メモリ並列処理の標準化 API http://openmp.org/ 最新版は 30 3.0 バージョンによる違いはあまり大きくない サポートしているバージョンはともかく csp で動きます gcc も対応しています

やっぱり SPMD Single Program Multiple Data プログラム #pragma omp parallel printf( I am %d of %d n, omp_get_thread_num(), omp_get_num_threads()); 画面出力 I am 0 of 4 I am 3 of 4 I am 2 of 4 I am 1 of 4 実行全員同じことをする thread 0 thread 2 printf( I am %d of %d n, 0, 4); printf( I am %d of %d n, 2, 4); thread 1 thread 3 printf( I am %d of %d n, 1, 4); printf( I am %d of %d n, 3, 4);

OpenMP ディレクティブ #pragma omp ほにゃらら OpenMP プログラムとしてコンパイルしないと きは無視される OpenMP 関数はダミーにすり替えられる うまくプログラムを書けば 同一のプログラムが逐次用にコンパイル 実行できる ややこしいところは 並列用にコンパイルするときに定義されるマクロ _OPENMP を使ってなんとかする

OpenMP の並列化 OpenMP は自動並列化ではない 正しく動作するかどうかは プログラマの責任 逐次コンパイルと同じ演算をするかどうかも プログラマの責任

並列実行 #pragma omp parallel 直後の文 ( 複文でもよい ) が並列 ( 重複 ) 実行される 入れ子になっていてもよい が スレッドを作りすぎるとオーバーヘッドが大

基本 #include <omp.h> main() { pre(); pre(); #pragma omp parallel comp(); post(); } comp(); comp(); comp(); comp(); >> /usr/vac/bin/xlc qsmp=omp test.c >> setenv OMP_NUM_THREADS 4 post(); >> a.out

何プロセスで実行するか 3 通りの設定方法がある 環境変数 OMP_NUM_THREADS 関数 void omp_set_num_threads(int num_threads); #pragma omp parallel num_threads( スレッド数 ) 複数指定したら 下の方が優先される ( 多分 )

変数はどうなるか 私有 (private) と共有 (shared) がある 私有 : そのスレッドからしか参照できない 共有 : 他のスレッドから参照 変更できる デフォルト parallel の内側で宣言されれば 私有 parallel の外側で宣言されていれば 共有れば parallel 節で逆の指定をすることもできる private( 変数リスト ) とか shared( 変数リスト )

変数はどうなるか int x; #pragma omp parallel { int y; } めもり int x; { int y; { int y; { int y; { int y; } } } } ひとつだけのスレッド 0 用のスレッド 1 用のスレッド 2 用のスレッド 3 用の x y y y y

メモリモデル メモリアクセスは プログラムの通りの順序で行われるとは限らない volatile int x=0, y; スレッド 0 は 共有変数 y に produce() の結果を書き それから x を 1 にする #pragma omp parallel if (omp_get_thread_num() == 0) { スレッド 1 は x が 1 になったのを確認して y = produce(); y を読み込んで consume() の引数に渡す x = 1; } else { という具合には動作してくれない! while (x == 0); ( するかもしれないが しないかもしれない ) consume(y); () } こういうプログラムは よしておこう

flush 特殊な命令 (flush) の前後で メモリアクセス の順序を保証する 右のプログラム片の場合 part A に含まれるメモリ書きこみやメモリ読み出しが完了するまで part B に含まれるメモリ読み出しやメモリ書きこみは行われない キャッシュをフラッシュしてしまうかもね ほかのスレッドについては何も言えない part A #pragma omp flush part B

barrier #pragma omp barrier 同期する flush を含む #pragma omp parallel { pre(); #pragma omp barrier post(); } pre(); pre(); pre(); pre(); barrier post(); post(); post(); post(); barrier の前にあるスレッドがメモリに書きこんだものは barrier の後ではどのスレッドからでも読みだせる

parallel l の中で役立つもの #pragma omp single 直後の文を どれかひとつのスレッドで実行する #pragma omp master 直後の文は スレッド 0 番で実行される #pragma omp critical ( なまえ ) クリティカルセクション ( 名前はなくてもよい ) #pragma omp atomic 不可分演算 (x += a とか x ++ とかのみ )

for 文の並列処理 #pragma omp parallel for 直後に for 文を書く for (i = 0; i < 100; i++) のタイプのやつ ループがスレッドに分割されて実行される for (i=0; i<25; i++) for (i=25; i< 50; i++) for (i=50; i<75; i++) for (i=75; i<100; i++) # 図はイメージです

ループの分割はいろいろ static 一定のサイズのチャンクが ラウンドロビンでスレッドに割り当てられる dynamic 一定サイズのチャンクで 計算を終えたスレッドが 計算されていないチャンクを取りに行く guided 似るがクズがだだ dynamic に似ているが チャンクサイズがだんだん小さくなる

reduction スレッドをまたぐ総和のような演算を 勝手にやってくれる #pragma omp parallel for reduction(+; a) for (i=0; i< 100; i++) a += b[i]; 自分でプログラムするのはちょっと面倒 いくつかやり方がある ; 考えてみてね

性能について 共有メモリ並列処理は メモリアクセス競合が性能のボトルネックになりやすい データをキャッシュに乗せれば 主記憶アクセスの競合はない しかし キャッシュが共有の場合もある 単純な同期しか準備されていない 遅延隠蔽などが難しい コア数と同数のスレッド数というのが想定

むかしのウェブページについて 10 年近く前に 須田が名古屋大学の講義の ために作ったウェブページがあるたウ 当時は OpenMP の日本語資料は少なかった いまでも OpenMP で検索すると上位に来てしまう しかし 時代遅れになってしまっている 当時は 4 CPU マシンは数百万円もした メモリ性能 キャッシュサイズも全然違う といいつつ 今回の資料はあまりそれと違わない

並列処理言語について スーパーコンでは MPI と OpenMP というのが 標準的なプログラミング いずれもある時間スロットでマシンを占有的に利用する前提で作られている ( バッチ処理 ) コア数と OpenMP スレッド数 ノード数とド数と MPI プロセス数を同じにする ( ハイブリッド並列化 ) 十万コアを超える現在 百万コアを超える近い将来 こんなプログラムでよいはずはない