データ並列処理 - OpenMP* ループ (カウント付き)

タスクがループ反復であり、反復の値の範囲がループを開始する前に判明している場合、ループは容易に 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_end

Fortran プログラムでは、Fortran do 文の直前に !$omp parallel do ディレクティブ追加します。

   ...
   !$omp parallel do
      do i = 1, N
        ステートメント
      end do
   !$omp end parallel do

ヒント

OpenMP* 並列フレームワークを使用してコードを書き直した後、インテル® Advisor でパフォーマンスを解析できます。Vectorization and Code Insights (ベクトル化とコードの調査) パースペクティブを使用して、OpenMP* コードがどの程度ベクトル化されているか解析するか、Offload Modeling (オフロードのモデル化) パースペクティブで GPU でのパフォーマンスをモデル化できます。

OpenMP* コンパイラーは、並列構造のカプセル化をサポートします。ローカル変数の取得規則は、デフォルトもしくはプラグマ/ディレクティブの一部で指定できます。ループ制御変数はデフォルトでプライベートであり、各反復は割り当てられた値を参照します。

関連情報