【发布时间】:2016-05-24 17:35:07
【问题描述】:
我有以下要并行化的代码:
int ncip( int dim, double R)
{
int i;
int r = (int)floor(R);
if (dim == 1)
{
return 1 + 2*r;
}
int n = ncip(dim-1, R); // last coord 0
#pragma omp parallel for
for(i=1; i<=r; ++i)
{
n += 2*ncip(dim-1, sqrt(R*R - i*i) ); // last coord +- i
}
return n;
}
在没有 openmp 的情况下运行的程序执行时间是 6.956 秒,当我尝试并行化 for 循环时,我的执行时间大于 3 分钟(那是因为我自己结束了它)。我在并行化这段代码方面做错了什么?
第二次尝试
int ncip( int dim, double R)
{
int i;
int r = (int)floor( R);
if ( dim == 1)
{ return 1 + 2*r;
}
#pragma omp parallel
{
int n = ncip( dim-1, R); // last coord 0
#pragma omp for reduction (+:n)
for( i=1; i<=r; ++i)
{
n += 2*ncip( dim-1, sqrt( R*R - i*i) ); // last coord +- i
}
}
return n;
}
【问题讨论】:
-
您是否启用了嵌套并行?您是否尝试过使用
pragma omp task?你可以产生多少线程?你用什么处理器?你传递了什么参数? -
你似乎在每次迭代中更新
n,这样是非法的,除非你使用reduction -
使用任务并将中间结果存储在数组中。最后,将所有结果相加
-
您能否为您观察到的运行时提供一个具体的可重现示例(请参阅minimal reproducible example)
标签: c++ parallel-processing openmp