インテル® Advisor ユーザーガイド

タスク並列処理 - OpenMP* タスク

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

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

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

ANNOTATE_SITE_BEGIN(sitename);
     ANNOTATE_TASK_BEGIN(task1); 
          ステートメント-1; 
     ANNOTATE_TASK_END(); 
     ANNOTATE_TASK_BEGIN(task2); 
          ステートメント-2; 
     ANNOTATE_TASK_END(); 
     ANNOTATE_TASK_BEGIN(task3); 
          ステートメント-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
...

関連情報