【发布时间】:2011-12-22 22:37:17
【问题描述】:
我想编写一个采用 openMP 并行性的函数,但无论是否从并行区域内调用都应该可以工作。所以我使用了if 子句来抑制并行性,但这并不像我想的那样工作:
#include <omp.h>
#include <stdio.h>
int m=0,s=0;
void func()
{
bool p = omp_in_parallel();
// if clause to suppress nested parallelism
#pragma omp parallel if(!p)
{
/* do some massive work in parallel */
#pragma omp master
++m;
#pragma omp single
++s;
}
}
int main()
{
fprintf(stderr,"running func() serial:\n");
m=s=0;
func();
fprintf(stderr," m=%d s=%d\n",m,s);
fprintf(stderr,"running func() parallel:\n");
m=s=0;
#pragma omp parallel
func();
fprintf(stderr," m=%d s=%d\n",m,s);
}
创建输出
running func() serial:
m=1 s=1
running func() parallel:
m=16 s=16
因此对func() 的第一次调用运行良好:m 和s 获得了应有的值 1,但从并行区域内对func() 的第二次调用确实创建了嵌套并行(16 个团队每个线程 1 个),即使这被抑制了。那就是 omp master 和 omp single 指令绑定到前面的 omp parallel if(!p) 指令而不是外部并行区域。
当然可以通过下面的代码解决这个问题
void work()
{
/* do some massive work in parallel */
#pragma omp master
++m;
#pragma omp single
++s;
}
void func()
{
if(omp_in_parallel())
work();
else
#pragma omp parallel
work();
}
但这需要定义一个额外的函数等。是否可以在单个函数中执行此操作(并且无需重复代码)?
【问题讨论】:
标签: openmp