3

OpenMp で for ループを使用して並列セクションを作成する手法はあるのでしょうか。

たとえば、n 個の異なる #pragma omp セクションを作成する代わりに、セクションごとにパラメータを変更する n 回反復for ループを使用して作成したいと考えています。

#pragma omp parallel sections
{
   #pragma omp section
   {
      /* Executes in thread 1 */
   } 
   #pragma omp section
   {
      /* Executes in thread 2 */
   } 
   #pragma omp section
   {
      /* Executes in thread n */
   } 
}
4

1 に答える 1

5

明示的な 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 以降をサポートしています。

于 2012-12-10T22:39:45.110 に答える