36
OpenMP* 4.0 における SIMD およびアフィニティー機能の導入

OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

OpenMP* 4.0 における SIMD およびアフィニティー機能の導入

Page 2: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

法務上の注意書きと最適化に関する注意事項 本資料に掲載されている情報は、インテル製品の概要説明を目的としたものです。本資料は、明示されているか否かにかかわらず、また禁反言によるとよらずにかかわらず、いかなる知的財産権のライセンスを許諾するものではありません。製品に付属の売買契約書『Intel's Terms and Conditions of Sale』に規定されている場合を除き、インテルはいかなる責任を負うものではなく、またインテル製品の販売や使用に関する明示または黙示の保証 (特定目的への適合性、商品適格性、あらゆる特許権、著作権、その他知的財産権の非侵害性への保証を含む) に関してもいかなる責任も負いません。 性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル® マイクロプロセッサー用に最適化されていることがあります。SYSmark* や MobileMark* などの性能テストは、特定のコンピューター・システム、コンポーネント、ソフトウェア、操作、機能に基づいて行ったものです。結果はこれらの要因によって異なります。製品の購入を検討される場合は、他の製品と組み合わせた場合の本製品の性能など、ほかの情報や性能テストも参考にして、パフォーマンスを総合的に評価することをお勧めします。 © 2013 Intel Corporation.無断での引用、転載を禁じます。Intel、インテル、Intel ロゴ、Intel Core、Intel Xeon Phi、Xeon は、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。 * その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

最適化に関する注意事項

インテル® コンパイラーは、互換マイクロプロセッサー向けには、インテル製マイクロプロセッサー向けと同等レベルの最適化が行われない可能性があります。これには、インテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2)、インテル® ストリーミング SIMD 拡張命令 3 (インテル® SSE3)、ストリーミング SIMD 拡張命令 3 補足命令 (SSSE3) 命令セットに関連する最適化およびその他の最適化が含まれます。インテルでは、インテル製ではないマイクロプロセッサーに対して、最適化の提供、機能、効果を保証していません。本製品のマイクロプロセッサー固有の最適化は、インテル製マイクロプロセッサーでの使用を目的としています。インテル® マイクロアーキテクチャーに非固有の特定の最適化は、インテル製マイクロプロセッサー向けに予約されています。この注意事項で対象としている特定の命令セットに関する詳細は、該当製品のユーザーズガイドまたはリファレンス・ガイドを参照してください。

改訂 #20110804

Page 3: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

OpenMP* API

• 業界標準の OpenMP 4.0

• 共有メモリー型並列プログラミング向けの C/C++ と Fortran 向け API

• 宣言子(C/C++ ではプラグマ)ベース

• ベンダーやプラットフォームに渡る移植性

• 様々なタイプの並列性をサポート

Page 4: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

ハードウェアの進化(インテル)

イメージは実際のダイサイズを反映することを意図していません

64 ビットインテル® Xeon® プロセッサー

インテル® Xeon® プロセッサー 5100 シリーズ

インテル® Xeon® プロセッサー 5500 シリーズ

インテル® Xeon® プロセッサー 5600 シリーズ

インテル® Xeon® プロセッサー E5-

200v2 シリーズ

インテル®

Xeon Phi™ コプロセッサー

7120P

周波数 3.6GHz 3.0GHz 3.2GHz 3.3GHz 2.7GHz 1.238MHz

コア 1 2 4 6 12 61

スレッド 2 2 8 12 24 244

SIMD 幅 128 (2 クロック)

128 (1 クロック)

128 (1 クロック)

128 (1 クロック)

256 (1 クロック)

512 (1 クロック)

Page 5: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

OpenMP 4.0 における並列性レベル

クラスター コンピューターのグループ 高速相互接続を介して通信

コプロセッサー/ アクセラレーター

特殊な計算デバイス 特別な相互接続を介してローカルノードに接続

ノード プロセッサーのグループ 共有メモリーを介して通信

ソケット コアのグループ 共有キャッシュを介して通信

コア 機能ユニットのグループ レジスターを介して通信

ハイパースレッド 機能ユニットを共有するスレッド・コンテキストのグループ

スーパースカラー 機能ユニットを共有する命令グループ

パイプライン 機能ユニットを共有する命令のシーケンス

ベクトル 複数の機能ユニットを使用する単一命令

OpenMP 4.0 SIMD

デバイス向けの OpenMP 4.0

OpenMP 4.0 アフィニティー

OpenMP 4.0 アフィニティー

OpenMP 4.0 アフィニティー OpenMP 4.0 アフィニティー

Page 6: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

OpenMP 4.0 SIMD

Page 7: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

OpenMP 4.0 以前

• プログラムは自動ベクトル化に依存... • ...もしくは、ベクトル固有拡張を使用

• プログラム・モデル(例えば、インテル® Cilk™ Plus) • コンパイラー・プラグマ(例えば、 #pragma vector) • 低レベルの構文(例えば、 __mm_add_pd())

#pragma omp parallel for #pragma vector always #pragma ivdep for (int i = 0; i < N; i++) { a[i] = b[i] + ...; }

コンパイラーが "正しい" ことをするのを信頼する必要がある

Page 8: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

OpenMP* SIMD 構文

• ループの入れ子をベクトル化 • ループを SIMD ベクトル・レジスターに収まるようにチャンクに分割 • ループ本体を並列化しない

• 構文 (C/C++)

#pragma omp simd [節[[,] 節],…] for ループ

• 構文 (Fortran) !$omp simd [節[[,] 節],…] do ループ

Page 9: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

• 例 void sprod(float *a, float *b, int n) { float sum = 0.0f; #pragma omp simd reduction(+:sum) for (int k=0; k<n; k++) sum += a[k] * b[k]; return sum; }

ベクトル化

Page 10: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

データ共有節

• private(var-list): var-list で指定された、初期化されないベクトル変数

• firstprivate(var-list): var-list で指定された、初期化されたベクトル変数

• reduction(op:var-list): var-list で指定された変数をプライベートに作成し、構文の最後で op で指定されるリダクション操作を行う

42 x: ? ? ? ?

42 x: 42 42 42 42

42 x: 12 5 8 17

Page 11: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

SIMD プラグマ/宣言子の節

• safelen(length) • 依存性を損なうことなく同時に実行できる最大反復数 • 実際には、最大ベクトル長

• linear (list[:linear-step]) • 変数の値はループ反復数に関連する

xi = xorig + i * linear-step • aligned (list[:alignment])

• list 変数のアライメントを指定する • デフォルトのアライメントはアーキテクチャーに依存する

• collapse (n)

Page 12: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

SIMD ワークシェア構文

• 入れ子になったループの並列化とベクトル化を行う • スレッドチーム間でループ反復空間を分割する • SIMD ベクトル・レジスターに収まるようにループチャンクを分割

• 構文 (C/C++)

#pragma omp for simd [節[[,] 節],…] for ループ

• 構文 (Fortran) !$omp do simd [節[[,]節],…] do ループ

Page 13: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

• 例 void sprod(float *a, float *b, int n) { float sum = 0.0f; #pragma omp for simd reduction(+:sum) for (int k=0; k<n; k++) sum += a[k] * b[k]; return sum; }

並列化

ベクトル化

スレッド 0 スレッド 1 スレッド 2

Page 14: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

SIMD 関数のベクトル化

• SIMD 関数のベクトル化 float min(float a, float b) { return a < b ? a : b; } float distsq(float x, float y) { return (x - y) * (x - y); }

void example() {

#pragma omp parallel for simd for (i=0; i<N; i++) { d[i] = min(distsq(a[i], b[i]), c[i]); } }

Page 15: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

SIMD 関数のベクトル化

• SIMD 並列ループから呼び出すように1つ以上の関数を宣言する

• 構文 (C/C++): #pragma omp declare simd [節[[,]節],…] [#pragma omp declare simd [節[[,]節],…]] […] 関数の定義または宣言

• 構文 (Fortran):

!$omp declare simd (proc-name-list)

Page 16: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

#pragma omp declare simd float min(float a, float b) { return a < b ? a : b; }

#pragma omp declare simd float distsq(float x, float y) { return (x - y) * (x - y); }

void example() {

#pragma omp parallel for simd for (i=0; i<N; i++) { d[i] = min(distsq(a[i], b[i]), c[i]); } }

SIMD 関数のベクトル化

vec8 min_v(vec8 a, vec8 b) { return a < b ? a : b; }

vec8 distsq_v(vec8 x, vec8 y) { return (x - y) * (x - y); }

vd = min_v(distsq_v(va, vb, vc))

Page 17: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

SIMD 関数のベクトル化

• simdlen (length) • 指定されたベクトル長(length)をサポートする関数を生成

• uniform (argument-list) • 引数(argumrnt-list)は、指定されたループ反復間の定数値

• inbranch • 関数は常に if 文内部から呼び出される

• notinbranch • 関数は if 文内部から呼び出されない

• linear (argument-list[:linear-step]) • aligned (argument-list[:alignment]) • reduction(operator:list)

前と同じ

Page 18: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

SIMD 構文とパフォーマンス

M. Klemm, A. Duran, X. Tian, H. Saito, D. Caballero, and X. Martorell.近年のマルチコア SIMD アーキテクチャー向けにOprnMP ベクトル構文を拡張2012 年 6 月、イタリア・ローマで開催されたインテル・ワークショップの資料ページ59-72より。LNCS 7312

3.66x

2.04x 2.13x

4.34x

1.47x

2.40x

0.00x

0.50x

1.00x

1.50x

2.00x

2.50x

3.00x

3.50x

4.00x

4.50x

5.00x

Mandelbrot Volume Rendering BlackScholes Fast Walsh Perlin Noise SGpp

相対

的スピードアップ

(高

値が

良い)

ICC auto-vec

ICC SIMD directive

Page 19: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

デバイス向けの OpenMP 4.0

Page 20: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

デバイスモデル

• OpenMP 4.0 によるアクセラレーター/コプロセッサーのサポート

• デバイスモデル: • 1つのホスト • 同種の複数のアクセラレーター/コプロセッサー

ホスト コプロセッサー

Page 21: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

デバイス向けの OpenMP 4.0 - 構文

• ホストからデバイスへ制御 [とデータ] を転送

• 構文 (C/C++) #pragma omp target [data] [節[[,]節],…] 構造化ブロック

• 構文 (Fortran) !$omp target [data] [節[[,]節],…] 構造化ブロック

• 節 device(scalar-integer-expression) map(alloc | to | from | tofrom:list) if(scalar-expr)

Page 22: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

実行モデル

• target 構文は制御フローをターゲットデバイスへ転送 • 制御の転送はシーケンシャルで同期される • 転送節はデータフローの方向を制御 • 配列表記は、配列の長さを表現するために使用される

• target data 構文はデバイスのデータ環境にスコープを生成 • 制御の転送は行われない • 転送節はデータフローの方向を制御 • デバイスのデータ環境は、ターゲットのデータ領域が有効な間適用される

• target update は、ターゲットのデータ領域からデータの転送を要求する際に使用する

Page 23: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

実行モデル

• データ環境は字句でスコープされる • データ環境は波括弧を閉じた時点で破棄される • 割り当てられたバッファー/データは自動的に解放される

ホスト デバイス

#pragma omp target ¥

alloc(…) 1

from(…) 4

to(…) 2

pA

map(alloc:...)¥ map(to:...)¥

{ ...} 3

map(from:...)

Page 24: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

例 #pragma omp target data device(0) map(alloc:tmp[:N]) map(to:input[:N)) map(from:res)

{ #pragma omp target device(0) #pragma omp parallel for for (i=0; i<N; i++)

tmp[i] = some_computation(input[i], i);

update_input_array_on_the_host(input); #pragma omp target update device(0) to(input[:N]) #pragma omp target device(0) #pragma omp parallel for reduction(+:res)

for (i=0; i<N; i++) res += final_computation(input[i], tmp[i], i) }

ホスト

ターゲット

ホスト

ターゲット

ホスト

Page 25: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

teams 構文

• 複数レベルの並列デバイスをサポート

• 構文 (C/C++): #pragma omp teams [節[[,]節],…] 構造化ブロック

• 構文 (Fortran): !$omp teams [節[[,]節],…] 構造化ブロック

• 節 num_teams(integer-expression) num_threads(integer-expression) default(shared | none) private(list), firstprivate(list) shared(list), reduction(operator :list)

Page 26: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

コプロセッサーへ SAXPY をオフロードする

• SAXPY int main(int argc, const char* argv[]) { float *x = (float*) malloc(n * sizeof(float)); float *y = (float*) malloc(n * sizeof(float)); // Define scalars n, a, b & initialize x, y

#pragma omp target data map(to:x[0:n]) { #pragma omp target map(tofrom:y) #pragma omp teams num_teams(num_blocks) num_threads(nthreads) for (int i = 0; i < n; i += num_blocks){ for (int j = i; j < i + num_blocks; j++) { y[j] = a*x[j] + y[j]; } } } free(x); free(y); return 0; }

全てが同じことを行う

Page 27: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

コプロセッサーへ SAXPY をオフロードする

• SAXPYコプロセッサー/アクセラレーター

int main(int argc, const char* argv[]) { float *x = (float*) malloc(n * sizeof(float)); float *y = (float*) malloc(n * sizeof(float)); // Define scalars n, a, b & initialize x, y #pragma omp target data map(to:x[0:n]) { #pragma omp target map(tofrom:y) #pragma omp teams num_teams(num_blocks) num_threads(bsize) #pragma omp distribute for (int i = 0; i < n; i += num_blocks){ #pragma omp parallel for for (int j = i; j < i + num_blocks; j++) { y[j] = a*x[j] + y[j]; } } } free(x); free(y); return 0; }

全てが同じことを行う

ワークシェア (barrier なし)

ワークシェア (barrier あり)

Page 28: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

コプロセッサーへ SAXPY をオフロードする

• SAXPY複合構文 int main(int argc, const char* argv[]) { float *x = (float*) malloc(n * sizeof(float)); float *y = (float*) malloc(n * sizeof(float)); // Define scalars n, a, b & initialize x, y

#pragma omp target map(to:x[0:n]) map(tofrom:y) { #pragma omp teams distribute parallel for ¥ num_teams(num_blocks) num_threads(bsize) for (int i = 0; i < n; ++i){ y[i] = a*x[i] + y[i]; } } free(x); free(y); return 0; }

Page 29: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

OpenMP 4.0 アフィニティー

Page 30: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

NUMA はここに属する ...

• (ほとんど)すべてのマルチソケット計算サーバーは、NUMA システムである

• 異なるメモリー位置へのアクセス・レイテンシーは一定ではない • 異なるメモリー位置の帯域幅が異なる可能性がある

• 例:インテル® Xeon® E5-2600v2 シリーズ・プロセッサー

Xeon® E5-2600v2 Xeon® E5-2600v2

Page 31: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

スレッド・アフィニティー - なぜ重要なのか ?

0.00

10.00

20.00

30.00

40.00

50.00

60.00

70.00

80.00

90.00

100.001 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

GB/秒

[高値

がよ

り良

い]

スレッド/コア数

STREAM Triad, インテル® Xeon® E5-2697v2

compact, par scatter, par compact, seq scatter, seq

Page 32: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

スレッド・アフィニティー - プロセッサーのバインド バインドの方針は、マシンとアプリケーションに依存する

• スレッドを離して配置、例、異なるパッケージ

• (おそらく)メモリー帯域幅を向上させる • (おそらく)統合されたキャッシュサイズを改善 • (おそらく)同期構文のパフォーマンスを低下させる

• スレッドを近づけて配置、例、キャッシュを共有する可能性がある 2 つのコアに隣接

• (おそらく)同期構文のパフォーマンスを向上させる • (おそらく)利用可能なメモリー帯域幅とキャッシュサイズ(スレッドごとの)を低下させる

Page 33: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

OpenMP* 4.0 における スレッド・アフィニティー • OpenMP 4.0 は、配置のコンセプトを導入 ...

• 1 つ以上のプロセッサー上で動作する一連のスレッド • ユーザーによって定義される • 事前定義された配置:

• スレッド ハイパースレッドごとに 1 つの位置 • コア 物理コアごとに 1 つの位置 • ソケット プロセッサー・パッケージごとに 1 つの位置

... そしてアフィニティーのポリシーは .... • spread OpenMP スレッドをすべての位置に広く配置 • close OpenMP スレッドをマスター・スレッドの近辺にパック • master OpenMP スレッドをマスター・スレッドを併置

• ... そしてこれらの設定を制御する • 環境変数 OMP_PLACES と OMP_PROC_BIND • 並列領域向けに proc_bind 節

Page 34: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

スレッド・アフィニティーの例

• 例 (インテル® Xeon Phi™ コプロセッサー): 外部領域を分配し、内部領域を近く保つ

OMP_PLACES=cores(8) #pragma omp parallel proc_bind(spread) #pragma omp parallel proc_bind(close)

p0

p1

p2

p3

p4

p5

p6

p7

p0

p1

p2

p3

p4

p5

p6

p7

p0

p1

p2

p3

p4

p5

p6

p7

Page 35: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®

まとめ

• OpenMP 4.0 は、OpenMP における大きな飛躍 • 新しい種類の並列性を導入 • コプロセッサー・デバイスによる異種システム構成をサポート

• インテル® Composer XE 2013 SP1 におけるサポート

• SIMD 構文 (combined 構文を除く) • デバイス向けの OpenMP (combined 構文を除く) • OpenMP アフィニティー

Page 36: OpenMP* 4.0 における SIMD およびアフィニティー機能の導入Affinity.pdf性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル®