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

时间:2015-06-27 20:08:48

标签: parallel-processing 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 forpragma omp master嵌套。有没有解决方法,除了将它们更改为pragma omp parallel for并放弃主循环之外的分支?

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

提前致谢

1 个答案:

答案 0 :(得分:1)

是的,只需像这样内联循环内部循环

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示例并行化内部循环。