task 指令は、タスクのデータ環境を定義する次のデータ属性節を取ります。
default (private | firstprivate | shared | none)
private (list )
firstprivate (list )
shared (list )
shared 節にリスト指定された変数へのタスク中のすべての参照は、 task 指令の直前に存在する同じ名前の変数を参照します。
private および firstprivate 変数のそれぞれに対し、新しいストレージが作成され、task コンストラクトの字句エクステントにある元の変数へのすべての参照は、新しいストレージへの参照に置き換えられます。firstprivate 変数は、タスクが検出された時点の元の変数値で初期化されます。
OpenMP 3.0 仕様のバージョン 3.0 (節 2.9.1) には、parallel、task、および worksharing 領域で参照される変数のデータ共有属性の決定方法が説明されています。
コンストラクト中で参照される変数のデータ共有属性は、事前定義、明示的定義、または暗黙的定義のいずれかです。明示的に指定されたデータ共有属性を持つ変数は、指定されたコンストラクトの中で参照される変数で、コンストラクト上のデータ共有属性節にリストされています。暗黙的に指定されたデータ共有属性を持つ変数は、指定されたコンストラクトの中で参照される変数で、事前に決められたデータ共有属性を持たず、コンストラクト上のデータ共有属性節にリストがありません。
変数のデータ共有属性を暗黙的に決めるための規則は、必ずしも明白ではない場合があります。予期せぬ事態を避けるため、プログラミングの際には、OpenMP の暗黙的なスコープ宣言規則に依存せずに、データ共有属性節を使用してタスク構文で参照されるすべての変数を明示的にスコープ宣言することをお勧めします。