関数の並列処理 - OpenMP* タスク

2 つ以上のタスクとして複数の関数呼び出しを並列に実行できます。これは、ソースがないライブラリー・コード内の関数に有用です。並列に実行する文は、関数呼び出しに限定されません (ヘルプの「データとタスク並列処理」を参照してください)。

次の例のように、アノテーション・サイトの最外の文がタスクに配置される場合、並列実行するのは容易です。

ヒント

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

C/C++ アノテーション・コードについて考えてみます。

    ANNOTATE_SITE_BEGIN(sitename);
        ANNOTATE_TASK_BEGIN(task1);
            statement-1;
        ANNOTATE_TASK_END();
        ANNOTATE_TASK_BEGIN(task2);
            statement-2;
        ANNOTATE_TASK_END();
        ANNOTATE_TASK_BEGIN(task3);
            statement-3;
        ANNOTATE_TASK_END();
    ANNOTATE_SITE_END();

C/C++ 並列コードでは、OpenMP* は並列コード内で #pragma omp parallel sections と関連するプラグマを明示的に指定できます。

 #pragma omp parallel sections 
 { 
     #pragma omp section 
     { 
          ステートメント-1; 
     } 
     #pragma omp section 
     { 
          ステートメント-2; 
     }..
 }

次のアノテーション付き Fortran コードについて考えてみます。

call annotate_site_begin("sitename")
   call annotate_task_begin("task_1")
     call subroutine_1
   call annotate_task_end

   call annotate_task_begin("task_2")
     call subroutine_2
   call annotate_task_end
call annotate_site_end
...

並列化された Fortran コードの場合、OpenMP* は並列コード領域内の対応するアノテーションを行えることができる !$omp sections と関連するディレクティブを指定できます。

!$omp parallel
 !$omp sections 
 !$omp section
   call subroutine_1 
 !$omp section
   call subroutine_2 
 !$omp end sections 
!$omp end parallel
...

関連情報