OpenMP* 4.x における拡張
OpenMP 4.0 と 4.5 の機能拡張© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

su g atec h

内容• OpenMP* 3.1 から 4.0 への拡張
• OpenMP* 4.0 から 4.5 への拡張

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

su g atec h追加された機能（3.1 -> 4.0)
• C/C++ 配列シンタックスの拡張• SIMD と SIMD 対応関数
• デバイスオフロード• task 構⽂の依存性• taskgroup 構⽂• cancel 句と cancellation point 句• 追加されたランタイム API• 追加された環境変数© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

su g atec hother¥task_dep.c

Task の依存性
Task 構⽂で depend 節を使⽤し依存性を明記#include <stdio.h>
int main() {int x = 0, y = 0;
#pragma omp parallel#pragma omp single{#pragma omp task shared(x) depend(out: x)
x = 1;#pragma omp task shared(x) depend(in: x)
y = x + 1;
printf("x = %d y = %d¥n", x, y);}return 0;}

タスク構⽂間でのデータ依存を明⽰的に指定できるようになりました。
この例では、x =2 がセッ
トされるまで、printf は待機します

フロー依存（out,in)、アンチ依存(in,out)、出⼒依存(out,out) を制御できます© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

su g atec hTaskgroup 構⽂

other¥taskgroup.c

Taskgroup 句は、taskgroup 内で⽣成された⼦タスク（孫タスク）の完了を待機することを指⽰できます
int main() {int i; tree_type tree;
init_tree(tree);#pragma omp parallel#pragma omp single{#pragma omp task
start_background_work();for (i = 0; i < max_steps; i++){#pragma omp taskgroup{#pragma omp task
compute_tree(tree);} // ここですべての compute_tree の完了を待機
check_step();}} // ここで background_work が完了していることが要求される
print_results();
return 0;}© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

この 2 つのタスクは同時に実⾏され、start_background_work()
は、compute_tree() の同期の影響を受けない

su g atec hCancel 句
指定された構⽂タイプの最も内側の並列領域の要求をキャンセルします
if ⽂、while ⽂、do ⽂、switch ⽂とラベルの後には指定できません︓#pragma omp cancel [構⽂タイプ] [[,] if 節]
構⽂タイプ︓ parallel、sections、for、taskgroupif 節︓ if(スカラー式)
注︓構⽂に到達したとき、デッドロックを引き起こす可能性があるロックやその他のデータ構造を解放する必要があります。ブロックされたスレッドは取り消すことができません© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

su g atec h#define N 10000
void example() {std::exception *ex = NULL;#pragma omp parallel shared(ex){#pragma omp forfor (int i = 0; i < N; i++) {// no 'if' that prevents compiler optimizations
try {causes_an_exception();}catch (std::exception *e) {// 後で例外を処理するため ex にステータスをストア#pragma omp atomic write
ex = e;// for ワークシェアリングをキャンセル#pragma omp cancel for}}// 例外が発⽣したら parallel 構⽂をキャンセル
if (ex) {#pragma omp cancel parallel}
phase_1();#pragma omp barrier
phase_2();}// 例外がワークシェア・ループ内でスローされている場合は継続
if (ex) {// ex の例外処理}}© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

Cancel 句の例
例外をキャッチしたらfor ワークシェア並列処理をキャンセル
例外をキャッチしたらparallel 並列処理をキャンセル

su g atec hCancellation point 句指定された構⽂タイプの最も内側の並列領域のキャンセルが要求された場合に、キャンセルをチェックする位置を指定︓#pragma omp cancellation point [構⽂タイプ]
構⽂タイプ︓ parallel、sections、for、taskgroup
制約事項︓• この構⽂は、実⾏⽂が許可されている場所にのみ追加できます• if ⽂のアクション⽂として使⽤したり、プログラムで参照されるラベルの実⾏⽂として使⽤することはできません© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

su g atec hCancellation point 句の例
subroutine example(n, dim)
integer, intent(in) :: n, dim(n)integer :: i, s, err
real, allocatable :: B(:)
err = 0!$omp parallel shared(err)! ...
!$omp do private(s, B)
do i=1, n!$omp cancellation point doallocate(B(dim(i)), stat=s)
if (s .gt. 0) then!$omp atomic write
err = s!$omp cancel doendif! ...
! deallocate private array B
if (allocated(B)) thendeallocate(B)
endif
enddo
!$omp end parallel
end subroutine© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

他のスレッドはこの位置でキャンセルをチェック
allocate ⽂からエラーが返された時にcancel do をアクティブにしますsu g atec h追加されたランタイム API• omp_get_cancellation• omp_get_proc_bind• omp_set_default_device• omp_get_default_device• omp_get_num_devices• omp_get_num_teams• omp_get_team_num• omp_is_initial_device© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

su g atec h追加された環境変数• OMP_CANCELLATION• OMP_DEFAULT_DEVICE• OMP_DISPLAY_ENV• OMP_PLACES© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

su g atec h追加された機能（4.0 -> 4.5)
• オフロード• ⾮構造化データ割り当て、⾮同期オフロード、MAP 節の拡張

• SIMD ベクトル• ループ構造への linear 節の追加
• SIMD 構造への simdlen 節の追加

• Task 構造の依存性制御と priority 制御• Taskloop (taskloop simd) 構⽂の追加*• 追加されたランタイム API• 追加された環境変数*インテル® コンパイラー V16 update 1 では未サポート© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

su g atec hTaskloop 句の追加

*インテル® コンパイラー V16 update 1 では未サポート

For (C/C++) または Do (Fortran) ループ構造を、OpenMP のタスクを使⽤して並列化します。インテル® Cilk™ Plus の _Cilk_for (_Cilk_for_Simd) に類似しています#pragma omp for [simd]#pragma omp taskloop [simd]

指定可能な節︓
if ([ taskloop :] スカラー式)、shared(list)、private(list)、firstprivate(list)、lastprivate(list)、default(shared | none)、grainsize(grain size)、num_task(num task)、collapse(n)、final(スカラー式)、priority(priority 値)、untiled、mergable、nogroup
スケジュールは、for ワークシェアの schedule 節とは異なり、grainsize と num_task で制御© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

su g atec h追加されたランタイム API• omp_get_max_task_priority© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

su g atec h追加された環境変数• OMP_MAX_TASK_PRIORITY© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

su g atec h

付録• インテル® C/C++ および Fortran コンパイラー V15 と V16でサポートされる OpenMP 4.x の機能© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

su g atec hインテル® C/C++ および Fortran コンパイラー V15 と V16• PLACE と THREAD アフィニティー (15.0, 16.0)• SIMD 拡張の主要機能 (15.0)• デバイス/アクセラレーター拡張の主要機能 (15.0, 16.0)• Simd,parallel,target,teams,distribute の複合構⽂ (15.0, 16.0)• taskgroup と task depend ⽂ (15.0, 16.0)• Atomic のシーケンシャル⼀貫性 (15.0, 16.0)• エラー処理 (15.0, 16.0)• ユーザー定義リダクション (16.0 C++, Fortran は今後のリリースで)• Fortran 2003 サポート (15.0)• ユーザー定義ベクトル異種関数 (16.0)• __intel_simd_lane() 関数 (15.0, 16.0)• #pragma omp ordered [simd | thread] (16.0)© 2016 iSUS. 無断での引⽤、転載を禁じます。* その他の社名、製品名などは、⼀般に各社の表⽰、商標または登録商標です。

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

su g atec h