OpenMP* 4.x における拡張
ベクトル化

2016 年 1 ⽉© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

内容
• 配列セクション (配列表記)• SIMD 構⽂による明⽰的なベクトル化

2© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

内容
• 配列セクション

3© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

配列セクション
配列セクションでは配列内の部分要素を指定でき、配列セクションの利⽤が許される句で利⽤できます。インテル® Cilk™ Plus の配列表
記のサブセット
⽂法: [下限 : レングス]、[下限 : ]、[ : レングス]、[ : ]4• 配列セクションは、元の配列の⼀部でなければいけません• 多次元配列でも利⽤できます• ベース⾔語の配列添字式を適⽤できます• 下限とレングスは整数式で次のように評価されます:[下限, 下限 + 1, 下限 + 2, …, 下限 + レングス -1]• 下限とレングスは + の整数でなければいけません• 配列の次元サイズが不明である場合、レングスを指定する必要があります• レングスが省略された場合、(配列サイズ – 下限) と評価されます• 下限が省略されると、デフォルトで 0 と評価されます© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

配列セクションインテル® Cilk™ Plus の配列表記との違い:
インテル® Cilk™ Plus の配列表記

OpenMP* 4.0 の配列セクション[下限 : レングス : ストライド][下限 : レングス]

サポート関数あり (__sec_reduce_add(a[:]) など)

サポート関数なし
Array.c使い⽅の例:
e[:] = f[:] + g[:](配列、ヒープ、またはスタック全体)

r[:] = s[i[:]]、r[i[:]] = s[:](gather, scatter)func(a[:])(scalar/simd 対応関数への引数)

if(5 == a[:]) result[:] = 0(条件式で利⽤可能)

5© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

内容
• 配列セクション• SIMD 構⽂による明⽰的なベクトル化• 概要と宣⾔⽂6© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

SIMD 構⽂による明⽰的なベクトル化• ベクトル化として知られる• Speed Kills• 90 年代に Cray のベクトルの歴史を変えたのは、マイクロプロセッ
サーのスピードだった• 私たちは、ベクトルを利⽤する歴史を再び繰り返します• マイクロプロセッサーのベクトルは、⻑い間 2 DP (倍精度)• 私たちは、いまパラレルワールドに暮らしている• それは、SIMD による並列性だけでなく、スレッドと MPI タスクによる並列処理も含む

7© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

これらをどう判断すべきか ?
SIMD レジスター幅は広まっているが、そのほかに考慮すべき事がある• キャッシュ:おそらくコヒーレントではない、 数階層先のメモリーの可能性• アライメント:キャッシュからレジスターへの⾮効率な転送を避ける• プリフェッチ:MIC はプログラマーの介⼊を必要とする• データの再配置

AoS と SoA、gather、scatter、permute• マスク:

条件付き実⾏を許すが、⾮効率になる恐れがある• ストライド:

1 が最良

コンパイラーは⽀援を必要とする
8© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

SIMD 宣⾔⽂コンパイラーにベクトル化のための情報を提供する
 演算の独⽴性を保証
 「指⽰どおりにしなさい」 という強制宣⾔
インテル® Cilk™ Plus

• SIMD 宣⾔⽂• ループ• C 配列• 関数• C/C++ のみ

9© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

OpenMP*• SIMD 宣⾔⽂• ループ• C 配列なし• 関数• C/C++ と Fortran
s

u g a

t

e

c h

OpenMP* SIMD の進化• 2013 年に OpenMP 4.0 で初めて実装• 宣⾔⽂• SIMD• SIMD do/for• declare SIMD

• OpenMP 4.5 (2015 年 11 ⽉) において、⼀部を改良© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

内容
• 配列セクション• SIMD 構⽂による明⽰的なベクトル化• 概要と宣⾔⽂• なぜ必要なのか?
• SIMD は OpenMP* の進化形
• インテル® Cilk™ Plus と OpenMP*• SIMD 構⽂の使い⽅と例

11© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

SIMD プラグマが必要な理由
独⽴性のないループはベクトル化されない• ベクトル化が失敗する原因: 多くのポインター、複雑なインデックス ... (ivdep はヒント)• SIMD pragma は、コンパイラーにループ反復を SIMD 操作するように強制#pragma なしで、/Qopt-report=2 (Windows*)、 -qopt-report=2 (Linux*) でレポートを取得:「remark #15541: 外部ループは⾃動ベクトル化されませんでした: SIMD 宣⾔⽂の使⽤を検討してください」

void do2(double a[n][n], double b[n][n], int end){#pragma SIMD または #pragma omp SIMD
for (int i=0 ; i<end ; i++) {a[i][0] = (b[i][0] - b[i+1][0]);a[i][1] = (b[i][1] - b[i+1][1]);}}© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

ivdep と vector always
は、ここでは作⽤しない

s

u g a

t

e

c h

インテル® Cilk™ Plus  OpenMP* 対応機能
インテル® Cilk™ Plus
• SIMD (ループ)– reduction– vectorlength– linear (インクリメント)– private、lastprivate

OpenMP*• SIMD (ループ)– reduction– safelen– linear (インクリメント)– private、lastprivate

例 (Fortran)!dir$ simd reduction(+:mysum) linear(j:1) vectorlength(4)do…; mysum=mysum+j; j=fun(…); enddo!$omp simd reduction(+:mysum) linear(j:1) safelen(4)do…; mysum=mysum+j; j=fun(…); enddo
13© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

インテル® Cilk™ Plus – OpenMP* SIMD 違い
インテル® Cilk™ Plus
• SIMD (ループ)– firstprivate– vectorlengthfor– [NO]VECREMAINDER– [no]assert• #pragma cilk grainsize

OpenMP• SIMD (ループ)– aligned(var_list,bsize)– collapse– schedule(kind, chunk)• #pragma taskloop simd**インテル® コンパイラー V16 では未サポート

14© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

⾃動ベクトル化 : シリアル・セマンティクスによる制限
コンパイラーは以下をチェックする︓

for(i = 0; i < *p; i++) {A[i] = B[i] * C[i];sum = sum + A[i];}•*p はループ不変か ?

•A[]、B[]、C[] はオーバーラップしているか ?

•sum は、B[] および/または C[] とエイリアスされているか ?

•演算操作の順番は重要か ?

•ターゲット上のベクトル演算はスカラー演算よりも⾼速であるか ?
(ヒューリスティックの評価）

add_sum.cpp

⾃動ベクトル化は⾔語規則によって制限される︓ 意図することを表現できない© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

SIMD プラグマ/宣⾔⽂による

明⽰的なベクトル・プログラミング
プログラマーの主張︓#pragma omp simd reduction(+:sum)for(i = 0; i < *p; i++) {A[i] = B[i] * C[i];sum = sum + A[i];}•*p はループ不変•

A[] は、B[] および C[] とオーバーラップしない•

sum は、B[] および C[] とエイリアスされていない•

sum はリダクションされる•

コンパイラーが効率良いベクトル化のため順番を⼊れ替えることを許容する•

ヒューリスティックの評価が利点をもたらさなくても、ベクトル化されたコードを⽣成

add_sum.cpp

明⽰的ベクトル・プログラミングにより何を意図するかを表現できる︕© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

SIMD 構⽂の表記
OpenMP* 4.0#pragma omp simd [節[ [,] 節]…]!$OMP SIMD [節[ [,] 節]…]C/C++
Fortran

ループ指定• 内側か外側のループを指定できる
結果は開発者が保証しなければならない• 開発者は、ループが SIMD に適していることを明⽰• ループ伝搬依存が無く、反復は並列に評価できること• SIMD プラグマ/宣⾔⼦の振る舞いを変更するため、節を選択できる• 開発者は結果を評価しなければならない© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

su17 g atec hOMP SIMD の節
reduction(operator:v1, v2, …)• v1、v2 ... は、 operator で操作するリダクション変数• 配列の平均値や総和を単⼀のスカラー変数に求める場合など︓ reduction (+:sum)linear(v1:step1, v2:step2, …)• SIMD レーンでプライベートにする 1 つ以上の項⽬とループ反復空間に対してリニアな関係を持つことを宣⾔ : linear (i:2)

safelen(length)• SIMD 命令によって同時に 2 つの反復が実⾏できない場合、この値でより⼤きな論理的反復空間を指定する• ⼀般的な値は、 2、4、8、もしくは 16

OpenMP 4.5 仕様を参照︓http://www.openmp.org/mp-documents/openmp-4.5.pdf© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

OMP SIMD の節（続き）
aligned(v1:alignment, v2:alignment)• 各リスト項⽬（v1、v2) が、オプションのパラメーター（alignment) で指定されたバ
イト数でアライメントされていることを宣⾔する

collapse(n)• ⼊れ⼦になった n 個のループ構造を、より⼤きな 1 つのループに畳み込むことを指⽰

private(v1, v2, …), lastprivate (v1, v2, …)• 暗黙のタスクもしくは SIMD レーンでプライベートにする 1 つ以上の項⽬を宣⾔する。
lastprivate 節では、領域終了後に指定された項⽬が更新される© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

ベクトルループ中のデータ
float sum = 0.0f;
float *p = a;
int step = 4;
#pragma omp simdfor (int i = 0; i < N; ++i) {sum += *p;p += step;
}

•
•
•
•

add_sum2.cpp+= 操作を⾏う 2 つの⾏は、互いに異なる意味を持つ
プログラマーは、この違いを表現する必要がある
コンパイラーは、異なるコードを⽣成する必要がある
変数 i、p、そして step は、それぞれ異なる意味を持つ© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

ベクトルループ中のデータ
float sum = 0.0f;
float *p = a;
int step = 4;
#pragma omp simd reduction(+:sum) linear(p:step)for (int i = 0; i < N; ++i) {sum += *p;p += step;
}

•
•
•
•

add_sum2.cpp+= 操作を⾏う 2 つの⾏は、互いに異なる意味を持つ
プログラマーは、この違いを表現する必要がある
コンパイラーは、異なるコードを⽣成する必要がある
変数 i、p、そして step は、それぞれ異なる意味を持つ© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

OMP SIMD 構⽂の制限事項
omp simd 構⽂の制限事項（すべてが記載されていない）︓
for / do ループにのみ適⽤インダクション変数は、符号あり/なしの int のみ
関連するループは、構造化ブロックであること
SIMD 領域の内側から外側へ、または外側から内側へ分岐するプログラ
ムはサポートされない• OpenMP* 構⽂は SIMD 領域内に記述できない• ループ本体は、C++ 例外と Windows* 構造化例外処理、setjmp(…)& longjmp(…) が在ってはならない••••© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

演習
• SIMD1• MATMUL© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

内容
• 配列セクション• SIMD 構⽂による明⽰的なベクトル化• 概要と宣⾔⽂• なぜ必要なのか?
• SIMD は OpenMP* の進化形
• インテル® Cilk™ Plus と OpenMP*• SIMD 構⽂の使い⽅と例• SIMD 対応関数
• SIMD 対応関数の使い⽅と例

24© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

SIMD 対応関数の概念• スカラー構⽂は単⼀要素の操作を記述できる• 開発者は︓• スカラー値を操作する標準的な関数を記述• 関数にベクトル属性と修飾⼦を注釈#pragma omp declare simd や !$OMP DECLARE SIMD
• ベクトル属性を⽰すため適切な修飾⼦を利⽤する• スカラー引数よりも、引数の配列を操作する関数呼び出しを⾏う• コンパイラーは︓• スカラーとベクトルバーションのコードを⽣成• ベクトル化されたループからベクトル関数を呼び出すことができる• スカラーループからスカラー関数を呼び出すことができる© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

SIMD 対応関数
• SIMD 化可能な関数
double fun1(double r, double s, double t);
double fun2(double r, double s, double t);…
void driver (double R[N], double S[N], double T[N]){for (int i=0; i<N; i++){A[i] = fun1(R[i],S[i],T[i]);B[i] = fun2(R[i],S[i],T[i]);}}26© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

インテル® Cilk™ Plus の SIMD 対応関数
• スカラーまたはベクトル引数で呼び出し可能• SIMD バージョンと共に配列表記を使⽤ (ベクトル幅に最適化)**__declspec(vector) double fun1(double r, double s, double t);__declspec(vector) double fun2(double r, double s, double t);…

// 要素を処理する関数;// 並列コンテキスト (Cilk Plus) では、ベクトル版の配列を提供

void driver (double R[N], double S[N], double T[N]){A[:]= fun1(R[:],S[:],T[:]);
配列表記 (アレイ・ノーテーション)
B[:]= fun2(R[:],S[:],T[:]);}** または __attribute__((vector))© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

インテル® Cilk™ Plus で有効、omp declare 違い
OpenMP* :インテル® Cilk™ Plus :#pragma omp declare simd <節>!$OMP DECLARE SIMD <節>__declspec(vector) <節>

インテル® Cilk™ Plus
• vector 節• vectorlength• linear• uniform• [no]mask• processor(cpuid)• vectorlengthfor28© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

C/C++
Fortran

OpenMP*• declare simd ⽂• simdlen• linear• uniform• inbranch/notinbranch• aligned
s

u g a

t

e

c h

SIMD 対応関数
• 1 要素を処理する関数を記述し、次のように pragma を記述する#pragma omp declare simd
float foo(float a, float b, float c, float d){return a * b + c * d;}

• スカラーバージョンの呼び出し︓e = foo(a, b, c, d);• ベクトル・バージョンを SIMD ループから呼び出す︓#pragma omp simdfor(i = 0; i < n; i++) {A[i] = foo(B[i], C[i], D[i], E[i]);}• インテル® Cilk™ Plus 配列表記から呼び出す︓

dec_simd.c

A[:]= foo(B[:], C[:], D[:], E[:]);© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

SIMD 対応関数の概念• スカラー構⽂は、単⼀要素の操作を記述できる• 開発者は︓• スカラー値を操作する標準的な関数を記述• 関数にベクトル属性と修飾⼦を注釈#pragma omp declare simd
• ベクトル属性を⽰すため適切な修飾⼦を利⽤する• スカラー引数よりも、引数の配列を操作する関数呼び出しを⾏う• コンパイラー︓• スカラーとベクトルバーションのコードを⽣成• ベクトル化されたループからベクトル関数を呼び出すことができる• スカラーループからスカラー関数を呼び出すことができる© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

SIMD 対応関数 : 構⽂
OpenMP 4.0#pragma omp declare simd [節[ [,] 節]…]!$OMP DECLARE SIMD [節[ [,] 節]…]C/C++
Fortran• ベクトル句は、関数のすべての引数がベクトルとして扱われ、戻り値もベク
トルとして扱われることを意味する。これは、デフォルト動作• 開発者は、修飾⼦を指定することでデフォルトの動作を変えることができる• 関数プロトタイプやヘッダーファイルにも simd 対応宣⾔⼦を追加することを推奨© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

omp declare simd の節
オプションの節︓

uniform(param1[, param2]…)
共有、スカラー引数は全ての反復にブロードキャストされる
linear(param1:step1[, param2:step2]…)
シリアル実⾏中、指定するパラメーターは step 分だけインクリメントされる。例としては、⼀定の間隔を持つ誘導（インダクション）変数
simdlen(num)コンパイラーが判断して使⽤できるベクトルの最⼤サイズ。
通常は、2、4、8、もしくは 16aligned(argument-list[:alignment])argument-list 中のすべての argument は、少なくとも指定されたアライメントで配置されるOpenMP 4.5 仕様を参照︓http://www.openmp.org/mp-documents/openmp-4.5.pdf© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

SIMD 対応関数︓Linear/ Uniform の必要性
• なぜそれらが必要なのか?
• uniform もしくはlinear が省略されると、各引数はベクトルとして扱われる#pragma omp declare simd uniform(a) linear(i:1)
void foo(float *a, int i):a は、ポインターi は、 int [i, i+1, i+2, …] のシーケンス
a[i] は、ユニット・ストライドなロード/ストア ([v]movups)
dec_simd2.c#pragma omp declare simd
void foo(float *a, int i):a は、ポインターのベクトル
i は、int のベクトルa[i] は、スキャッター/ギャザーとなる
参考文献： http://software.intel.com/en-us/articles/usage-of-linear-and-uniform-clause-in-elemental-function-simd-enabled-function-clause© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

SIMD 対応関数︓呼び出しの依存性
呼ばれる側

dec_simd3.c#pragma omp declare simd uniform(a),linear(i:1),simdlen(4)void foo(int *a, int i){
std::cout<<a[i]<<"¥n";}

呼び出し側#pragma omp simd safelen(4)for(int i = 0; i < n; i++)foo(a, i);ベクトル化レポート

testmain.cc(5):(col. 13) remark:OpenMP SIMD LOOP がベクトル化されました
header.cc(3):(col. 24) remark:FUNCTION がベクトル化されました
header.cc(3):(col. 24) remark:FUNCTION がベクトル化されました
header.cc(3):(col. 24) remark:FUNCTION がベクトル化されました
header.cc(3):(col. 24) remark:FUNCTION がベクトル化されました
参考⽂献︓http://software.intel.com/en-us/articles/call-site-dependence-for-elemental-functions-simd-enabled-functions-in-c© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

SIMD 対応関数︓呼び出しの依存性
呼ばれる側

dec_simd3.c#pragma omp declare simd uniform(a),linear(i:1),simdlen(4)void foo(int *a, int i){
std::cout<<a[i]<<"¥n";}

呼び出し側#pragma omp simd safelen(4)for(int i = 0; i < n; i++) foo(a, i);#pragma omp simd safelen(4)for(int i = 0; i < n; i++){k = b[i]; // k はリニアでない
foo(a, k);}

ベクトル化レポート
testmain.cc(14):(col. 13) remark:OpenMP SIMD LOOP がベクトル化されました
testmain.cc(21):(col. 9) remark:関数 '?foo@@YAXPEAHH@Z' の適切なベクトルバージョンが⾒つかりません。
testmain.cc(18):(col. 1) remark:OpenMP SIMD LOOP がベクトル化されました
header.cc(3):(col. 24) remark:FUNCTION がベクトル化されました© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

SIMD 対応関数︓複数のベクトル定義
呼ばれる側

dec_simd3.c#pragma omp declare simd uniform(a),linear(i:1),simdlen(4)#pragma omp declare simd uniform(a),simdlen(4)void foo(int *a, int i){
std::cout<<a[i]<<"¥n";}

呼び出し側#pragma omp simd safelen(4)for(int i = 0; i < n; i++) foo(a, i);#pragma omp simd safelen(4)for(int i = 0; i < n; i++){k = b[i]; // k はリニアでない
foo(a, k);}

ベクトル化レポート
testmain.cc(14):(col. 13) remark:OpenMP SIMD LOOP がベクトル化されました
testmain.cc(18):(col. 1) remark:OpenMP SIMD LOOP がベクトル化されました
header.cc(3):(col. 24) remark:FUNCTION がベクトル化されました© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

SIMD 対応関数を使⽤する際の制限事項•

引数は 1 つの uniform または linear 句に記述できる•

linear 句に constant-linear-step 式が指定さる場合、正の整数式でなければならな
い•関数やサブルーチンは、構造化ブロックでなければならない•

SIMD ループから呼び出される関数やサブルーチンは、OpenMP* 構造を実⾏することはできない•関数やサブルーチンの実⾏では、SIMD チャンクの同時反復の実⾏を変更する副作⽤があってはならない•

関数の内側から外側へ、または外側から内側へ分岐するプログラムは不適合である•

C/C++:関数は、longjmp や setjmp を呼び出してはならない© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

内容
• 配列セクション• SIMD 構⽂による明⽰的なベクトル化• 概要と宣⾔⽂• なぜ必要なのか?
• SIMD は OpenMP* の進化形
• インテル® Cilk™ Plus と OpenMP*• SIMD 構⽂の使い⽅と例• SIMD 対応関数
• SIMD 対応関数の使い⽅と例• SIMD 構⽂とスレッド

38© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

SIMD とスレッド – インテル® Cilk™ Plus
• Cilk の “los tres amigos (3⼈の友達)”• cilk_for• cilk_spawn• cilk_sync• Cilk Plus ループは SIMD 化され、複数のスレッドで実⾏される• Cilk Plus ループ内では SIMD 対応関数を呼び出す

39© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

SIMD とスレッド – OpenMP* ワークシェア
OMP 宣⾔⽂ワークシェアと SIMD ループ

 ベクトルサイズでインクリメントするチャンクの SIMD ループを⽣成 余剰ループは⼀貫性を持つように処理される
 スケジュールの詳細は与えられない
シンタックス :複合宣言文!$OMP DO
#pragma omp for

SIMD <節>
simd <節>!$OMP TASKLOOPSIMD <節>#pragma omp taskloop simd <節>© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

F90
C/C++

節: 任意の do/for ⽂のデータ共有属
性、nowait など、任意の SIMD 句

タスクによる新しいスケジュール

s

u g a

t

e

c h 40SIMD のまとめ
インテル® Cilk™ Plus

OpenMP*• C 配列• タスクスレッドで動作(Fortran ループにはない)• C 配列なし• ワークシェアスレッド(C/C++, Fortran) で動作• SIMD ループと関数 (より適した節がある)• prefetch 命令がある• SIMD ループと関数(より適した節がある)• prefetch 命令はない(インテル® コンパイラーの命令を利⽤可能)41© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

参考サイトインテル® ソフトウェア・フォーラム、ナレッジベース、記事、ツールのサポート(http://software.intel.com 参照、http://isus.jp 翻訳版)
記事の例:
- http://www.isus.jp/article/parallel-special/requirements-for-vectorizable-loops/（ループをベクトル化するための条件）
OpenMP* 4.5 Specification- http://www.openmp.org５/mp-documents/openmp-4.5.pdf
OpenMP* 3.1 仕様をカバーするオンライン・トレーニング⁃ http://www.isus.jp/online-training/© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

関連書籍
Structured Parallel Programming: Patterns for Efficient Computation
著者 Michael McCool, James Reinders ,Arch Robison 出版⽇: 2012 年 7 ⽉ 9 ⽇ | ISBN: 978-0-124159938『構造化並列プログラミング: 効率良い計算を⾏うためのパターン』
著者

マイケル・マックール／アーク・D・ロビソン／ジェームス・レインダース（共著）訳者

菅原 清⽂／エクセルソフト株式会社（共訳） | ISBN

978-4-87783-305-3

Intel® Xeon Phi™ Coprocessor High Performance Programming
著者 Jim Jeffers , James Reinders 出版⽇: 2013 年 3 ⽉ | ISBN: 978-0-124104143『インテル® Xeon Phi™ コプロセッサー ハイパフォーマンス・プログラミング』
著者

ジェームス・レインダース/アーク・D・ロビソン（共著）訳者

菅原 清⽂／エクセルソフト株式会社（共訳） | ISBN

978-4-87783-332-9

High Performance Parallelism Pearls
著者 Jim Jeffers , James Reinders

出版⽇: 2014 年 11 ⽉

簡単にインテル® Xeon Phi™ コプロセッサー・ファミリーの優れた並列性を利⽤してコードを実⾏できるため、最適化に集中し、ハイパフォーマンスを実現することが可能です。並列処理を細かくチューニングすることで、正しいアプリケーションを正しく効率良いアプリケーションにすることができます。インテル コーポレーションの並列プログラミング・エバンジェリストである
James Reinders とインテル コーポレーションのエンジニアである Jim Jeffers により執筆された最新の書籍は、69 ⼈の専⾨家の実際の経験を基に、インテルのマルチコアおよびメニーコア・プロセッサーを最⼤限に利⽤するための創意⼯夫を紹介しています。
© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h

© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

s

u g a

t

e

c h