如何在 OpenMP 的单线程块中声明共享工作区?

How to declare a shared-working work region within a single-threaded block in OpenMP?

我正在尝试使用 OpenMP 为具有以下方案的函数编写并行代码:

1. Begin of data-dependent loop
    2. Some computation
    3. If the result of 2 equals 0 then
        3.1. Begin of data-independent loop
        3.2. Some computation
        3.3. End of data-independent loop
    4. Some computation by a single thread
    5. Begin of data-independent loop
        6. Some computation
    7. End of data-independent loop
8. End of data-dependent loop    

问题是 - 我想用类似的东西包围这些区域:

#pragma omp parallel
1. Begin of data-dependent loop
    #pragma omp master
    2. Some computation by a single thread
    3. If the result of 2 equals 0 then
        #pragma omp for
        3.1. Begin of data-independent loop
        3.2. Some computation
        3.3. End of data-independent loop
    4. Some computation by a single thread
    #pragma omp for
    5. Begin of data-independent loop
        6. Some computation
    7. End of data-independent loop
8. End of data-dependent loop

但是,编译器不允许我将 pragma omp for 嵌套在 pragma omp master 中。除了将它们更改为 pragma omp parallel for 并放弃主循环之外的分支之外,是否有任何解决方案?

如果不够清楚,请告诉我。

提前致谢

是的,像这样并行化内部循环

for(int i=0; i<n; i++) {
   cut = foo(i);
   if(!cut) {
       #pragma omp parallel for
       for(int j=0; j<m; j++) {
           //
       }
   }
   foo2();
   #pragma omp parallel for
   for(int j=0; j<k; j++) {
       //
   }
}

这是高效的,因为 OpenMP 的实现会在第一次调用它时创建一个线程池,这些线程可用于下一个并行区域,即线程不会在并行区域之间创建和销毁。在我看来,这是使用 OpenMP 的优点之一。使用例如创建一个玩具 OpenMP 模型非常容易。 pthreads 和实现静态调度但创建线程池更加困难。请注意,没有什么需要 OpenMP 创建池,但我使用的每个实现都会这样做。

cholesky-decomposition-with-openmp 并行化内循环的示例。