明示的な OpenMP タスクの場合:
#pragma omp parallel
{
// Let only one thread create all tasks
#pragma omp single nowait
{
for (int i = 0; i < num_tasks; i++)
#pragma omp task
{
// Code for task with parameters, based on i
}
}
// Let the threads process all tasks
#pragma omp taskwait
// Further parallel processing ...
}
OpenMP ディレクティブに続くコード ブロックtask
は、明示的なタスクです。明示的なタスクはキューに入れられ、後で実行されます。taskwait
ディレクティブは と同様に機能しますがbarrier
、タスク用です。同様の質問に対するこの回答も参照してください。
タスクは、他のタスクを再帰的に作成できます。したがって、明示的なタスクを使用してグラフとツリーを処理できます。ただし、オーバーヘッドに注意してください。これは、他のほとんどの構造のオーバーヘッドよりも大きく、schedule(dynamic)
. また、タスク内で参照される外部スコープの変数は、デフォルトでfirstprivate
.
明示的なタスクは、OpenMP 3.0 で追加された機能であることに注意してください。以前の OpenMP バージョンに準拠するコンパイラは、task
ディレクティブをサポートしていない可能性があります。ほとんどすべての最新のコンパイラは、OpenMP 2.0 のみをサポートする (VS2012 でも) Microsoft Visual C++ を除いて、OpenMP 3.0 以降をサポートしています。