3

我想知道是否有任何技术可以使用 for 循环在 OpenMp 中创建并行部分。

例如,我不想创建 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,但用于任务。另请参阅this answer to a similar question。

任务可以递归地创建其他任务。因此,显式任务可用于处理图形和树。但要注意开销 - 它比大多数其他构造的开销更大,并且与来自循环的开销非常相似schedule(dynamic)。此外,任务内部引用的外部范围的变量默认为firstprivate.

请注意,显式任务是 OpenMP 3.0 中添加的功能。符合早期 OpenMP 版本的编译器可能不支持该task指令。几乎所有现代编译器都支持 OpenMP 3.0 或更高版本,只有 Microsoft Visual C++ 例外,它只支持 OpenMP 2.0(即使在 VS2012 中)。

于 2012-12-10T22:39:45.110 回答