NUMAの構成

Similar documents
Microsoft Word - openmp-txt.doc

コードのチューニング

Microsoft PowerPoint - OpenMP入門.pptx

enshu5_4.key

演習1: 演習準備

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

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 - 阪大CMSI pptx

NUMAの構成

PowerPoint プレゼンテーション

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

02_C-C++_osx.indd

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

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

Microsoft PowerPoint - 03_What is OpenMP 4.0 other_Jan18

Microsoft PowerPoint - 阪大CMSI pptx

cp-7. 配列

openmp1_Yaguchi_version_170530

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

The 3 key challenges in programming for MC

OpenMPプログラミング

memo

Microsoft PowerPoint - compsys2-06.ppt

02: 変数と標準入出力

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

about MPI

第9回 配列(array)型の変数

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

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

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

スライド 1

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

memo

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

enshu5_6.key

POSIXスレッド

スライド 1

PowerPoint プレゼンテーション

memo

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

C 言語の式と文 C 言語の文 ( 関数の呼び出し ) printf("hello, n"); 式 a a+4 a++ a = 7 関数名関数の引数セミコロン 3 < a "hello" printf("hello") 関数の引数は () で囲み, 中に式を書く. 文 ( 式文 ) は

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

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

解答編 第 7 章実数型の計算と標準数学関数 演習問題 7.1 文法事項 1 ) 暗黙の型変換とは何か答えなさい 代入演算子 (=) や算術演算子 (+,-,*,/,%) では 2 つの演算項のデータ型が揃っている事が必要です 2 つの演算項のデータ型が異なる場合 可能ならば 演算項のデータ型を変換

#include<math.h> 数学関係の関数群で sin() cos() tan() などの三角関数や累乗の pow() 平方根を求める sqrt() 対数 log() などがあります #include<string.h> 文字列を扱う関数群 コイツもまた後日に 4. 自作関数 実は 関数は自分

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

Microsoft PowerPoint - 11.pptx

Microsoft Word - appli_SMASH_tutorial_2.docx

C C UNIX C ( ) 4 1 HTML 1

01_OpenMP_osx.indd

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

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

演算増幅器

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

スライド 1

C#の基本2 ~プログラムの制御構造~

Microsoft PowerPoint - kougi6.ppt

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

02: 変数と標準入出力

04-process_thread_2.ppt

Microsoft PowerPoint ppt [互換モード]

プログラミング実習I

Microsoft PowerPoint - prog03.ppt

Microsoft PowerPoint ppt [互換モード]

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

02: 変数と標準入出力

PowerPoint Presentation

3次多項式パラメタ推定計算の CUDAを用いた実装 (CUDAプログラミングの練習として) Implementation of the Estimation of the parameters of 3rd-order-Polynomial with CUDA

gengo1-8

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

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

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

計算機アーキテクチャ

I I / 47

Microsoft PowerPoint - OS07.pptx

第8回講義(2016年12月6日)

gengo1-11

Microsoft Word - VBA基礎(6).docx

C

PowerPoint プレゼンテーション

gengo1-12

Microsoft PowerPoint - 説柔5_間勊+C_guide5ï¼›2015ã•’2015æŒ°æŁŽæš’å¯¾å¿œç¢ºèª“æ¸‹ã†¿ã•‚.pptx

02: 変数と標準入出力

-2 外からみたプロセッサ GND VCC CLK A0 A1 A2 A3 A4 A A6 A7 A8 A9 A10 A11 A12 A13 A14 A1 A16 A17 A18 A19 D0 D1 D2 D3 D4 D D6 D7 D8 D9 D10 D11 D12 D13 D14 D1 MEMR

Microsoft PowerPoint - sales2.ppt

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

デジタル表現論・第6回

第1回 プログラミング演習3 センサーアプリケーション

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

4 分岐処理と繰返し処理 ( 教科書 P.32) プログラムの基本的処理は三つある. (1) 順次処理 : 上から下に順番に処理する ぶんきそろ (2) 分岐処理 : 条件が揃えば, 処理する はんぷく (3) 反復処理 : 条件が揃うまで処理を繰り返す 全てのプログラムは (1) から (3) の

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

ポインタ変数

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

演習準備

Microsoft PowerPoint - prog06.ppt

プログラミング基礎

Microsoft PowerPoint - 09.pptx

※ ポイント ※

PowerPoint Presentation

Transcription:

共有メモリを使ったデータ交換と同期 慶應義塾大学理工学部 天野英晴 hunga@am.ics.keio.ac.jp

同期の必要性 あるプロセッサが共有メモリに書いても 別のプロセッサにはそのことが分からない 同時に同じ共有変数に書き込みすると 結果がどうなるか分からない そもそも共有メモリって結構危険な代物 多くのプロセッサが並列に動くには何かの制御機構が要る 不可分命令 同期用メモリ バリア同期機構

Fork-join: 並列プロセスの開始と終了 fork fork で生まれたプロセス ( スレッド ) 間はメモリを共有 fork join で全プロセスの待ち合わせをする 同期を取っている 簡単な並列プログラムは fork/join のみで制御できる OpenMP join join

排他制御 プリンタがあり 一度に一つのプロセッサしか使えない 同時に要求があった場合に一人を選びたい アイディア : 変数 x を 0 に初期化しておく x を読んだプロセッサは 0 ならば素早く 1 を書き込み プリンタを利用 終わったら 0 を書き込む 1 を読み込んだプロセッサは 0 を読み込めるまで繰り返し読み続ける (Busy Waiting) しかしこれはうまく行かない なぜか?

P1 と P2 が同時に変数を読んだら? 3.1 を書きこむ 0 1.x を読み出す P2 1.xを読み出す 3.1を書きこむ 2.0かどうかをチェック P1 2.0 かどうかをチェック P1 が x を読んで 0 かどうかをチェックしている間に P2 が x を読み出すかもしれない P1,P2 共に 0 を取ることができる 読む操作と書く操作を不可分 (Atomic/Indivisible) に行う命令が必要 不可分命令

Test & Set (x) Test&Set(x) 0 Test&Set(x) x を読み出す 1 を書きこむ 2 つの操作を不可分に行う この間共有メモリを占有 P2 P1 同時に命令が実行されても 必ず一つだけ 0 を読み 他は 1 にする ハードウェアの支援が必要 他にも Swap, Compare&Swap, Fetch&Dec, Fetch&Add など色々あるが 原理は同じ

Critical Section の実行 Test&Set(x) =0? No. Yes. Critical Section この例ではプリンタを使う 一つだけが実行できる領域 x = 0 忘れずに x=0 にしておく. 不可分命令があれば Critical Section が作れる なんでもできる! でもちょっと使いにくい

バリア同期 バリア成立を待つ P1 P2 P3 Barrier; Barrier;. Barrier; バリア成立 バリア同期は不可分命令があれば作れるが 専用のハードウェアを使う場合もある

まとめ スマフォ ノート PC の全て サーバー スーパーコンピュータの多くが共有メモリ型計算機 ポイント 高速化のためには並列化が必要 プログラマによる並列化 来週 OpenMP の演習を行う コンパイラによる自動並列化 共有メモリを使ったデータ交換には同期が必要 不可分命令 バリア同期 分散したキャッシュの一貫性制御 スヌープキャッシュ ディレクトリキャッシュ

OpenMP を使ってみる 天野

OpenMP プログラムを並列化するためのプラグマ ( プログラムに対する指示文 :directive) ライブラリ 環境変数からできている並列プログラム環境 #pragma を directive と呼び この中で用いる特殊な構文を sub-directive と呼ぶ 共有メモリを使うため データを分散しなくて良い MPI 比較的小規模のマルチコアシステム向き 大規模なシステムでは高度の最適化が必要

OpenMP の実行モデル Block A #pragma omp parallel { { Block C Block B Master Thread Block A Block B Block B Block B Block C Thread fork Parallel Region Thread join 環境変数 : OMP_NUM_THREADS で実行スレッド数を設定

並列化の単位となる構文 #pragma omp parallel 内で並列処理を記述 for (do) sections single (master) 一文で実行と制御を兼ねる parallel for parallel section

for 文 反復は各スレッドに等分に割り当てられる # pragma omp parallel { #pragma omp for for(i=0; i<1000; i++) { } c[i]=a[i]+b[i]; } # pragma omp parallel for for(i=0; i<1000; i++) { } c[i]=a[i]+b[i];

sections 文 #pragma omp parallel sections { #pragma omp section sub1(); #pragma omp section sub2(); #pragma omp section } sub3(); sub1 sub2 sub3 Thread join 三つの違った処理が並列に実行され 終了時に同期される

private sub-directive # pragma omp parallel for private(c) for(i=0; i<1000; i++) { d[i]=a[i]+c*b[i]; } c は各スレッドにコピーされる 高速実行が可能

private sub-directive の利用 # pragma omp parallel for private(j) for(i=0; i<100; i++) { for(j=0; j<100; j++) a[i]=a[i]+amat[i][j]*b[j]; } この文を private(j) なしに実行したらどうなるだろう? 全てのスレッドで j が更新される エラー!

reduction sub-directive # pragma omp parallel for reduction(+:ddot) for(i=0; i<100; i++) { ddot+= a[i]*b[i]; } リダクション演算は データを足し込んでいく演算 良く用いられるが 並列実行は この sub-directive を使わないと難しい

組み込み関数 omp_get_num_threads(); 並列実行されるスレッド数を返す omp_get_thread_num(); 自分のスレッド番号を返す omp_get_max_threads(); 並列実行可能な最大スレッド数を返す 使い方 #include <omp.h> int nth, myid; nth = omp_get_num_threads(); myid = omp_get_thread_num();

時間を計る : omp_get_wtime(); #include <omp.h> double ts, te; ts = omp_get_wtime(); 実行 te = omp_get_wtime(); printf( time[sec]:%lf n,te-ts);

他の pragma single: #pragma omp single { blocks.. } 指定されたブロック内の文を単一スレッドに割り当てる master: #pragma omp master { blocks... } 指定されたブロック内の文をマスタースレッドに割り当てる

テスト環境 http://www.am.ics.keio.ac.jp/arc から OpenMP の演習資料 openmp19.tar をダウンロード tar xvf openmp19.tar で解凍

コンパイルと実行 gcc fopenmp hello.c o hello./hello Hello OpenMP world from 2 of 8. ここではスレッド数は 8 に設定されている これは 環境変数 OMP_NUM_THREADS をコマンドラインで設定することで変更できる 例 export OMP_NUM_THREADS=6./reduct じっさいのコア数を超える設定も可能だが速くならない

例題プログラム reduct4k.c 乱数で作った配列 a と b の積を計算して c に入れる この c の要素の全てを足して sum に入れる ( リダクション演算 ) extport OMP_NUM_THREADS=x により スレッド数を 1,2,3,4,6,8 に設定して実行し 実行時間を計測してみよ

演習 cg.c 共役勾配法は 大規模な連立一次方程式の反復解法 行列は正定値対称でないと解けないが 一定回数で収束するという特徴がある cg.c に pragma を挿入し スレッド数を 1,2,4 に変化させて時間を計測せよ 提出物は pragma を挿入したプログラムと実行時間