我有以下递归代码,我正在尝试使用c ++ open mp库并行执行。目前我刚刚在循环之前添加了条款#pragma omp parallel(因为我不能使用由于visual studio仅支持omp 2.0的任务)但它实际上减慢了速度。我做错了什么?
确定。根据您对使用omp部分的建议,我已经重写了我的代码。所以现在看起来像下面。但是,它仍然比顺序版本慢..
long long p (long long n, long long mmm)
{
long long c = 0;
long exponent = 0;
double ex;
long counter = 1;
long long ttt = 0;
long long ttt1 = 0;
long long b = 0;
long long a = 0;
long long h = 0;
while (counter > 0)
{
ex = pow(-1, counter - 1);
exponent = (long) ex;
ttt = (n - ( (counter * ( (3 * counter) - 1)) / 2));
ttt1 = (n - ( (counter * ( (3 * counter) + 1)) / 2));
#pragma omp parallel sections
{
#pragma omp section
{
if (ttt == 0 || ttt == 1)
{
a = exponent * 1;
c = c + a;
}
else if (ttt>0)
{
a = exponent * p((n - ( (counter * ( (3 * counter) - 1)) / 2)), mmm);
c = c + a;
}
}
#pragma omp section
{
//If n == 1 or 0 return 1 as per convention else do the calculation
if (ttt1 == 0 || ttt1 == 1)
{
b = exponent * 1;
c = c + b;
}
else if (ttt1 > 0)
{
b = exponent * p( (n - ( (counter * ( (3 * counter) + 1)) / 2)), mmm);
c = c + b;
}
}
}
if (ttt < 0 && ttt1 < 0)
break;
++counter;
}
答案 0 :(得分:1)
#pragma omp parallel
定义了将并行运行的代码部分。这意味着您将拥有整个while
循环的多个并行运行,而不是单个循环的迭代的并行运行。
这意味着OpenMP有大量开销来管理对变量的并发读/写访问,因此总运行时间更长。
如果您打算并行计算a
和b
,您应该将整个if ... else if ... else
标记为omp section
,假设它们是完全独立的计算。
循环的自动并行化只能通过for
的{{1}}循环来完成。