タスクがループ反復であり、反復の値の範囲がループを開始する前に判明している場合、ループは容易に OpenMP* で表現できます。
次のようなアノテート付きの C/C++ シリアルループについて考えてみます。
ANNOTATE_SITE_BEGIN(sitename);
for (int i = lo; i < hi; ++i) {
ANNOTATE_ITERATION_TASK(taskname);
ステートメント;
}
ANNOTATE_SITE_END();OpenMP* はループの並列化を容易にします。C または C++ プログラムでは、omp parallel for プラグマを for 文の直前に追加します。
...
#pragma omp parallel for
for (int i = lo; i < hi; ++i) {
ステートメント;
}次のようなアノテート付きの Fortran シリアルループについて考えてみます。
call annotate_site_begin("sitename")
do i = 1, N
call annotate_iteration_task("taskname")
ステートメント
end do
call annotate_site_endFortran プログラムでは、Fortran do 文の直前に !$omp parallel do ディレクティブ追加します。
...
!$omp parallel do
do i = 1, N
ステートメント
end do
!$omp end parallel doOpenMP* コンパイラーは、並列構造のカプセル化をサポートします。ローカル変数の取得規則は、デフォルトもしくはプラグマ/ディレクティブの一部で指定できます。ループ制御変数はデフォルトでプライベートであり、各反復は割り当てられた値を参照します。