OpenMP C Language API Specification
データ環境
threadprivate 指示文
#pragma OMP threadprivate( variable ,...)
スレッドに対して、privateな大域変数を指定する。
説明・コメント:
- 指定できるのは、大域変数のみ。
- スレッドのprivateな大域変数については書き込みのデータは他のスレッ
ドからは見えない。逐次部分とmaster sectionでは、マスタスレッドの
privateデータにのみ、アクセスする。
- parallel sectionの入口で、copyin clauseで指定されないかぎり、
thread privateの変数は未定義になる。
- 初期化は、全てのthread privateのデータに行われる。
初期化はスレッドが最初に参照されるまでに初期化がおこなわれる。
(現在のompccでは、masterスレッドのthreadprivateの変
数のみが初期化される。その他のスレッドのthreadprivateは初期化されない)
- dynamic thread mechanismがdisableで、かつ、全てのparallel region
が同じ数のスレッドの時にのみ、thread privateの変数はpersistentであるこ
とが保証される。
- thread private変数は、copyin clauseにのみつかうことができる。
private, firstprivate, lastprivate, sharedに使ってはならない。
default clauseからは影響を受けない。
データスコープ属性を指定するclause
- なにも指定されていない変数はsharedの属性を持つ。
- parallel region内で宣言されるauto変数はprivateとなる。
- dynamic extentにあるauto変数はprivate
- list で指定される変数は、そのスコープからアクセス可能
な変数でなくてはならない。sub-objectは指定できない(たとえば、メンバ変
数の一部のみは不可)。
- private( list )
-
それぞれのスレッドでprivateであることを示す。
-
それぞれのスレッドに対して、同じタイプの新しいオブジェクトが作られる。
そのオブジェクトは元のオブジェクトとは関係がない。
-
lexical extent内では、元のオブジェクトに対する参照はprivateオブジェク
トに置き換えられる。
-
並列構文にはいるときにはundefined. 出た時には元のオブジェクトは
undefined
-
引数で渡される以外は、dynamic extentでも、lexical extentの外では
undefined。
- shared( list )
-
スレッド間で共有されることを示す。
- default(shered|none)
-
デフォールトで適用される属性を示す。defaultは、lexical extent内の全て
のオブジェクトをsharedにする。
- default(shared)では、threadprivate変数以外の指定されていない変数
について、sharedにする。これがデフォールト。
- default(none)と指定されている時には、全てのlexcial extentにある変
数について、指定しなくてはならない。
- default clauseは parallel directiveにのみ指定できる。
- firstprivate(list)
-
はじめに元のオブジェクトからコピーされる以外は、privateとおなじ。
- lastprivate(list)
-
最後に、元のオブジェクトに書き戻す。その規則は:
-
for directiveに現れた時には、その中の条件文などは関係なく、最後の
iterationを実行したスレッドが元のオブジェクトをupdateする。
-
sectionsに現れた時には、lexicalに最後に実行したスレッドがupdateする。
- lexicalにわからないものについては、undefined.
- reduction( op : list)
-
- reductionで指定される変数は以下の形の式で参照されなくてはならない。
- x = x op expr
- x binop = expr
- x = expr op x (減算以外)
- x++
- ++x
- x--
- --x
exprの中にはxをふくんではならない。opは、 +, *, -, &, ^,|,&&,||
のいずれか。binopは +,*,-,&,^,|
のいずれか。
- reductionの中に現れる変数は、外側のcontextでは、sharedでなくては
ならない。
- copyin(list)
-
threadprivateと宣言されている大域変数に適用される。
threadprivateで指定されている変数に対し、マスタスレッドからcopyされる。
データ環境についての規則
-
parallel regionのlexical extentにある逐次のループのループ変数は、
デフォールトでsharedになっていても、自動的にprivateになる。parallel
regionの外側の逐次ループのループ変数は自動的に指定されることはない。
これを含む関数がparallel regionからよばれたとしても、これらのループ変
数をprivateにするかどうかはユーザの指定による。
- parallel regionでprivateになっている変数は、中にあるdirectiveで再
度、privateとすることはできない。したがって、private, firstprivate,
lastprivate, reductionがforあるいはsectionで指定されているものは、そ
の外側のparallel regionではsharedになっていなくてはならない。
- clauseのスコープは、実引数として引き渡される時以外は、static
extent内のみで有効である。
- dynamic extentにおいて、呼ばれた関数内でアクセスする大域変数は、
threadprivateで宣言されていない限り、暗黙のうちにsharedとしてアクセスされる。
- privateにできない変数は、default(private)に影響されない。
sharedにできない変数は、default(shared)に影響されない。
- 以下の場合を除いて、一つの変数に対しては一つの属性しか宣言できな
い。
- firstprivateとlastprivate両方で宣言する。
- defaultでの属性は、個々の属性の宣言によってオーバライドされる。
疑問点: