pd-mark OpenMP C language API Specification


並列構文

OpenMPの並列構文には、以下の要素がある:


parallel 構文

#pragma omp parallel [ clause  ,[[,]  clause  ] ...]
	 block-statement 
parallel , end parallel は、parallel regionを定義する。 block-statement 内のコードを複数のスレッドで並列に実行する。

clause は:

説明・コメント:


for 構文

#pragma omp for [ clause , ...]
   for(...; ...; ...)  body 
並列に実行されるループを指定する。 parallel region内の場合、直後のforループを並列に実行する。 この構文で指定可能な clause は、 また、 parallel 構文内に一つの並列ループのみがある場合には、次 の省略形を用いることができる。
#pragma omp parallel for [  clause , ...]
   for(...; ...; ...)  body 
この構文ではifを除く、parallelで指定できるclauseが全て指定可能となる。

forループは、canonical loopで無くてはならない。canonicalとは、

scheduleは、ループをどのようにスレッドに分割して実行するか を指定する。
schedule(static[,chunk])
chunkで指定されたサイズを単位として、各スレッドにround-robin方式で iterationを割り当てる。 chunkが指定されていない場合には等分割。
schedule(dynamic[,chunk])
指定されたchunkサイズのiterationをスレッドに割り当てて並列実行し、担当 したchunkの実行が終了したスレッドが残りのiterationから再びchunkサイズ を割り当てて実行していく。 chunkが指定されていない場合には1。
schedule(guided[,chunk])
指定されたchunkを最初の割り当て単位として、Guided Self Schedulingを用 いてiterationの割り当てを実行時に行う。 割り当てサイズは、残りのiterationに対応してexponentialに減らしていく。 chunkが指定されていない時には1。
schedule(runtime)
実行時に決定する。OMP_SCHEDULE環境変数で設定する。指定されていない場合 には、インプリメント依存。 chunkの指定はなし(エラー)。
scheduleの指定がない場合には、インプリメント依存。
OpenMP-compliantなプログラムはループの実行順序によらずに正しく実 行できなくてはならない。すなわち、上記のスケジューリングを指定したとし ても、コンパイラによってバリエーションがあるため、上記の特定のスケジュー リングに依存するべきではない。

説明・コメント:


sections 構文

#pragma omp sections [  clause  ....]
{
[#pramga omp section]
    block-statement

[#pramga omp section
    block-statement
]
....
}
それぞれのセクションを並列に実行する。それぞれのセクションは一度だけ実 行される。

この構文で指定可能な clause

また、 parallel 構文内に一つのセクション構文のみがある場合には、 次の省略形を用いることができる。

#pragma omp parallel sections [  clause  ....]
{
[#pramga omp section]
    block-statement

[#pramga omp section
    block-statement
]
....
}
この構文では、sectionsとparallelで指定できるclauseが全て指定可能である。

説明・コメント:


single 構文

#pragma omp single [ clause  ...]
     block-statement 
一つのスレッドだけで実行される部分を定義する。

clause

説明・コメント:


master 構文

#pragma omp master
    block-statement 
マスタスレッドのみが実行する部分を定義する。

説明・コメント:


critical 構文

#pragma omp critical [( name )]
   block-statement 
nameで指定されるcritical sectionを定義する。

説明・コメント:


barrier 指示文

#pragma omp barrier
チーム内のスレッド間でのバリア同期を行う。

atomic 構文

#pragma omp atomic
  statement 
次の文をアトミックに実行する。あるメモリの内容がatomicに更新されること を保証する。次の文だけに有効。次の文は以下のものでなくてはならない。 xはスカラー型のlvalue式でなくてはならない。exprはスカラ型の値の式で、x を含んではならない。binopは、
 +,*,-,/,&,^,|,<<,>> 
のいずれ か。

説明・コメント:


flush 指示文

#pragma omp flush [(list)]
この時点で、list内に指定されている変数について、 メモリの一貫性を保証する。リストがない場合には全ての変数に関してのメモ リの一貫性を保証する。 thread-visibleな変数は、メモリに対して書き戻される。例えば、コンパイラ はレジスタ上の値をメモリに書き戻し、ハードウエアはwrite bufferをフラッ シュする。

flush 指示文は以下の構文で、暗黙の内に実行される。

もしも、nowaitが指定されていれば、実行されない。 volatileな変数への書き込みはflushと同じような効果をもつ。

ordered 構文

#pragma omp ordered
   block-statement 
#pragma omp end ordered
blockを逐次loopと同じ順序で実行することを指定する。 ordered 構文は parallel ループの動的なextentにのみ 現れることができる。このparallelループでは、orderedが指定されてい なくてはならない。orderedで指定されるblockは、一度に一つのスレッドでし か実行されない。スレッドはそれまでのiterationの実行が終らない限り、こ のblockを実行しない。この構文は、このblock以外の部分は並列に実行 できることを示す。


directive bindingについての規則


directive nestについての規則