openmp programing [互換モード]jp.xlsoft.com/documents/intel/parallel/seminar/openmp...1 openmp*...

18
1 OpenMP* プログラミング実践 Intel、インテル、 Intel ロゴ、「Intel.さあ、その先へ。」ロゴ、Intel CoreItaniumMMXPentiumXeon は、アメリカ合衆 国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。 © 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。 *その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 June 2’ 2010 みなさん OpenMP* 、使ってますかあ? OpenMP* とは? 少し説明します。 OpenMP 2.5 3.0 の違いとプログラミングへの影響 OpenMP による並列化実装例 並列化の手順 適切な負荷分散 © 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。 *その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。 インテル ® ソフトウェア開発製品 1-2

Upload: others

Post on 16-Mar-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

1

OpenMP* プログラミング実践

Intel、インテル、 Intel ロゴ、「Intel.さあ、その先へ。」ロゴ、Intel Core、Itanium、MMX、Pentium、Xeon は、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

June 2’ 2010

みなさん OpenMP* 、使ってますかあ?

OpenMP* とは? 少し説明します。

OpenMP 2.5 と 3.0 の違いとプログラミングへの影響

OpenMP による並列化実装例

並列化の手順

適切な負荷分散

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品1-2

2

OpenMP とは?

ポータブルな、マルチスレッド並列処理を記述するアプリケーション・プログラム・インターフェイス(API)– 多くの Fortran 77 Fortran 90 C および C++ で実装される多くの Fortran 77、Fortran 90、C、および C++ で実装される

– インテル® コンパイラーは、Linux*、Mac OS* およびWindows* 環境をサポート

ループレベルの並列処理を標準化

粗粒度の並列処理をサポート

コード中にシリアルとパラレル領域が混在

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品7-3

非営利団体 OpenMP Architecture Review Board によって管理される(www.openmp.org)

OpenMP の歴史

OpenMP*Fortran 1.0

1997

OpenMP*Fortran 1 1

1999

2000Fortran 1.1

OpenMP*C/C++ 1.0

1998OpenMP*Fortran 2.0

OpenMP*C/C++ 2.0

2002OpenMP*FortranC/C++ 3.0

OpenMP*FortranC/C++ 2.5

2005 2008

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品7-4

インテル® コンパイラー 11.0 & 11.1マイクロソフト* Visual C++ 8, 9 & 10

3

コンパイラーがサポートする OpenMP* 仕様を確認

printf(“OpenMP version %d¥n”, _OPENMP);

コンパイラーはサポートする OpenMP バージョンが公開された年月をコンパイラ はサポ トする OpenMP バ ジョンが公開された年月を、_OPENMP マクロで数値として返す

openmp オプションでコンパイル

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品1-5

200203は2002年3月に公開された仕様、バージョン2.0であることを示す

サンプル omp.c

プログラミング・モデル

Fork-join 型の並列処理: •マスタースレッドは必要に応じて、スレッドのチームを生成する

•並列処理は動的に行われる つまり シリアル処理の•並列処理は動的に行われる。つまり、シリアル処理のプログラムは並列処理プログラムへ変化する

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品7-6

並列実行領域

マスタースレッド

4

OpenMP アーキテクチャー

OpenMP 構文は 5 つのカテゴリーに分けられる

• ランタイム関数/環境変数

• 並列実行領域 (Parallel 構文)

• ワークシェアリング (for 構文など)

• データ環境

• 同期

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品7-7

ループを並列化

最も時間がかかるループを特定する

そのループをスレッド間で分割する

void main() {double Res[1000];

#pragma omp parallel forfor(int i=0;i<1000;i++){

do huge comp(Res[i]);

void main() {double Res[1000];for(int i=0;i<1000;i++){

do_huge_comp(Res[i]);}

このループを複数のスレッド間で分割 OpenMP指示子

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品7-8

_ g _ p( [ ]);}

}

}}

逐次処理プログラム 並列処理プログラム

5

for 構文によるワークシェア

parallel 指示句で4つのスレッドチームが生成される

for 指示句で4つのスレッドチームに作業を分割する デフォルトではル プの

#pragma omp parallel #pragma omp for

for(int i=0;i<1000;i++){do_huge_comp(Res[i]);

}

業を分割する。デフォルトではループの最大値をスレッド数で割ったブロックを各スレッドに分散

i= 0 -> 249i= 250 -> 499

i= 500 -> 749i= 750 -> 999

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品1-9

最大スレッド数 4 と仮定

i 250 > 499 i 750 999

サンプル omp_for.c

デフォルトではブロック分割されるが、schedule句で変更可能

データアクセス競合と同期グローバルデータの書き込み

int sum; #pragma omp parallel for

sum#pragma omp parallel for

for(int i=0;i<100;i++)sum += A[i] * B[i];

i は 75から 99

i は 25から 50

i は 51から 74

i は 0から 24スレッド0 スレッド1 スレッド2 スレッド3

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品1-10

グローバル変数並列領域外のデータはグローバル変数となり、複数のスレッドからの同時書き込みは競合を発生する。ここで sum は並列領域外で定義されるグローバス変数であり、複数のスレッドから同時に更新され、競合を引き起こす。

6

データアクセス競合と同期グローバルデータの書き込みを同期

int sum; #pragma omp parallel forsum #pragma omp parallel for

for(int i=0;i<100;i++)#pragma omp atomic

sum += A[i] * B[i];

i は 75から 99

i は 25から 50

i は 51から 74

i は 0から 24スレッド0 スレッド1 スレッド2 スレッド3

su

12 3 4

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品1-11

同期指示句atomic 指示句や critical 指示句を使用すると、同時書込みを保護できる。しかし、過度な同期の利用はプログラムの性能に影響する。

データアクセス競合と同期グローバルデータの高度な同期

int sum; #pragma omp parallel for ¥sum #pragma omp parallel for ¥reduction(+:sum)

for(int i=0;i<100;i++)sum += A[i] * B[i];

i は 75から 99

i は 25から 50

i は 51から 74

i は 0から 24スレッド0 スレッド1 スレッド2 スレッド3

su

12 3 4

Lsum Lsum Lsum Lsum

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品1-12

リダクション指示節変数に対して同じ操作を繰り返す演算では、リダクションを適用できる。リダクションで指定された変数の更新は、各スレッドがローカルに行い、並列領域の最後でそれらは自動的にマージされる。

サンプル datarace.c

7

データアクセス競合と同期データ属性の変更

int sum, temp; #pragma omp parallel for ¥reduction(+:sum)

f (i t i 0 i 100 i ){sumtemp private(temp)

for(int i=0;i<100;i++){temp = A[i] * B[i];sum += temp;

}

i は 75から 99

i は 25から 50

i は 51から 74

i は 0から 24スレッド0 スレッド1 スレッド2 スレッド3

sum

12 3 4

Lsum Lsum Lsum Lsumtemp temp temp temp

?

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品1-13

プライベート指示節並列領域の外にあるグローバル変数を一時的にスレッドローカル変数とすることが出来ます。この例で変数 temp は一時変数として利用されるためプライベートとして扱うことが出来ます。

サンプル datarace.c

インテル® コンパイラーのレポート機能

インテル® コンパイラーのレポート機能を利用してデータアクセス競合の問題をいち早く検出

/Qdiag-enable:thread

ソースコード中のスタティックデータの参照、更新を検知

/Qdiag-enable:sc3

エラーの原因となる誤ったコーディングを検知

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品1-14

サンプル datarace.c

8

OpenMP* 2.5 と 3.0 の主な仕様の違い

OpenMP 3.0 ではスレッドモデルにタスクの概念を導入(task 指示句)

入れ子になったループの関連付けをサポート(collapse 指示節)

f 構文のル プカウンタ の制限緩和(f 構文) for 構文のループカウンターの制限緩和(for 構文)

For 構文の schedule 指示節のスケジュールモードに auto を追加

ランタイム API で schedule が制御可能に(omp_set/get_schedule())

プログラム中で利用する最大スレッド数を設定可能に(OMP_THREAD_LIMIT)

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品1-15

仕様の違いでどのような改善が可能か?

スレッドモデルにタスクの概念の導入for 構文を利用すると

parallel 指示句で4つのスレッドチームが生成される

for 指示句で4つのスレッドチームに作

#pragma omp parallel #pragma omp forfor(i=0; i<MAX; i++)

a[i] += b[i] * c[i];

o 指示句で のスレッドチ ムに作業を分割する。デフォルトではループの最大値をスレッド数で割ったブロックを各スレッドに分散

i= 0 -> 24 i= 25 -> 49 i= 50 -> 74 i= 75 -> 99

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品1-16

最大スレッド数 4 そして MAX を 100 と仮定 サンプル task0.c

9

スレッドモデルにタスクの概念の導入task 構文を利用すると

parallel 指示句で4つのスレッドチームが生成される

for ループは1つのスレッドで実行する

#pragma omp parallel #pragma omp singlefor(i=0; i<MAX; i++)#pragma omp task

a[i] += b[i] * c[i];

task 指示句でタスクをキューに投入。この場合タスクは、 a[i] += b[i] * c[i]の処理

タスク

タスク

.

.このループでは100個のタス

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品1-17

最大スレッド数 4 そして MAX を 100 と仮定

タスク

.

タスクキュー

残りのスレッド(ワーカースレッド)は、キューからタスクを取得して実行

クがエントリーされる

サンプル task1.c

入れ子になったループの関連付けをサポート(1)collapse 指示節

#pragma omp parallel for private(j, k)for(i = 0; i < 3; i++)

for(k = 0; k < 2; k++)for(k = 0; k < 2; k++)for(j = 0; j < 3; j++)

printf(“i=%d k=%d j=%d Thread(%d)¥n”,i, k, j, omp_get_thread_num());

上記のような入れ子構造のループを for 構文でワークシェアする場合、for 指示文が指定されたレベルのループがワークシェアされる。

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品1-18

この例では、k と j のループは各スレッドで処理される。生成されるスレッドはインデックス i で分割される最大 3 つのスレッド。

10

入れ子になったループの関連付けをサポート(2)collapse 指示節

Collapse 指示節は、入れ子になった外側のループと、内側のループを結合し大きなループに展開して並列化を行う。これにより、入れ子構造のループをより多くのスレッドで処理し、各スレッドの負荷は均等になる。

#pragma omp parallel for private(j, k) collapse(2)for(i = 0; i < 3; i++)

for(k = 0; k < 2; k++)

使い方: collapse (レベル)レベルには展開する階層を指示する。下記の例のcollapse(2) では、2階層、つまりインデックス k まで展開することを意味する。

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品1-19

for(j = 0; j < 3; j++) printf(“i=%d k=%d j=%d Thread(%d)¥n”,

i, k, j, omp_get_thread_num());

for(i=0;…) と for(k=0;…) は完全な入れ子でなければいけません。間に処理があるとエラーとなります。

OpenMP* による並列化実装例

この例題 2D レイトレーサー/レンダラーは、並列化によるスピードアップの効果を視覚的に比較できるようになっています。

コード中の各ピクセルのレンダリングを並列化します。

並列化後のプログラムの正当性は、インテル® Parallel Inspector で検証できます。並列化されたコード領域では最小限の同期を行います(無いほうが良い)。

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品

11

OpenMP による並列化の手順

1. 実行時間のかかる場所を特定する。2. OpenMP を利用して並列化する場所を決定する3 O MP 宣言子を記述する3. OpenMP 宣言子を記述する4. 実行して並列化の効果を確認する

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品

実行時間のかかる場所を特定する

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品

Parallel Studio の Parallel Amplifier を利用して、ホットスポットをプロファイル

12

OpenMP を利用して並列化する場所を決定

1. 頻繁に呼び出されている関数を確認2. ループを構成する上位の関数を探す3 OpenMP を利用して並列化を記述する3. OpenMP を利用して並列化を記述する

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品

頻繁に呼び出されている関数を確認

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品

shader <- trace <- render_one_pixel <- parallel_thread の関係がわかる

13

ループを構成する上位の関数を探す(1)

trace のソースコードを確認

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品

ここは OpenMP で並列化を記述できるか?

ループを構成する上位の関数を探す(2)

render_one_pixel のソースコードを確認

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品

ここは OpenMP で並列化を記述できるか?

14

ループを構成する上位の関数を探す(3)Parallel_thread のソースコードを確認

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品

ここは OpenMP で並列化を記述できるか?

OpenMP を利用して並列化を記述する

static void parallel_thread (void){

// thread-local storageunsigned int serial = 1;unsigned int mboxsize = sizeof(unsigned int)*(max objectid() + 20);unsigned int mboxsize sizeof(unsigned int) (max_objectid() + 20);

unsigned int * local_mbox = (unsigned int *) alloca(mboxsize);memset(local_mbox,0,mboxsize);

for (int y = starty; y < stopy; y++) { drawing_area drawing(startx, totaly-y, stopx-startx, 1);for (int x = startx; x < stopx; x++) {

color_t c = render_one_pixel (x, y, local_mbox, serial, startx, stopx, starty, stopy);drawing.put_pixel(c);

} if(!video->next_frame()) return;

}

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品

}}

parallel for 構文を使って並列化

15

並列化の効果を確認する

実行時間は改善されたか?

シリアルコード対してどれくらい早くなったか?

そのコードをよりコア数の多いシステムで実行してみると?

実行時間は改善されたか?

シリアルコード対してどれくらい早くなったか?

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品

実行に際し何か傾向があるか?

8 スレッドで実行した場合

インテル® スレッド・プロファイラーでスレッドの動作を検証

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品

スレッドの負荷が均一ではない。なぜか?

16

何が問題か?

この領域はオブジェクトが少ないない

この領域はオブジェクトが多い

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品

つまり、2つ以上のスレッドで処理を行うと、各スレッドの負荷が異なる

均等な負荷分散を OpenMP で指示するには

次の2つの方法で、負荷分散が均等になることを確認する

1. for 構文で schedule 句を指定する1. for 構文で schedule 句を指定する

2. task 構文を利用する

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品

変更後再度ビルドを行い、処理時間とスケーリングを確認する

17

8 スレッドで再検証する

インテル® スレッド・プロファイラーでスレッドの動作を検証

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品

変更前と比較すると?

まとめ

OpenMP にも実装方法は幾つかある

もっとも効率良い方法を探すには効率良 法を探す

• スレッドがどのように動作しているか

• 各スレッドがどのデータを処理しているか

を知ることは重要

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品

18

本資料に掲載されている情報は、インテル製品の概要説明を目的としたものです。製品に付属の売買契約書『Intel‘s Terms and conditions of Sales』に規定され

ている場合を除き、インテルはいかなる責を負うものではなく、またインテル製品の販売や使用に関する明示または黙示の保証 (特定目的への適合性、商品性

に関する保証、第三者の特許権、著作権、その他、知的所有権を侵害していないに関する保証、第三者の特許権、著作権、その他、知的所有権を侵害していないことへの保証を含む) に関しても一切責任を負わないものとします。

インテル製品は、予告なく仕様が変更されることがあります。

* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

© 2010 Intel Corporation.

© 2010 Intel Corporation. 無断での引用、転載を禁じます。 記載内容は予告なしに変更されることがあります。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

Intel、インテル、 Intel ロゴは、アメリカ合衆国およびその他の国における Intel Corporation またはその子会社の商標または登録商標です。

インテル® ソフトウェア開発製品1-35