我在C中使用OpenMP来并行化我的程序。我有这样的代码:
for (num = 0; num < NUM_DATA; num++) {
for (i = 0; i < NUM_AB; i++) {
A[i] = some_calc(data[num], B[i]);
}
for (i = 0; i < NUM_AB; i++) {
B[i] = other_calc(A[i]);
}
}
我将代码并行化为这样的代码:
for (num = 0; num < NUM_DATA; num++) {
#pragma omp parallel
{
#pragma omp for
for (i = 0; i < NUM_AB; i++) {
A[i] = some_calc(data[num], B[i]);
}
#pragma omp for
for (i = 0; i < NUM_AB; i++) {
B[i] = other_calc(A[i]);
}
}
}
当我运行并行化代码时,我的运行时间比串行版本差得多。从我所学到的,发生这种情况是因为,在每次num
次迭代结束时,创建的并行区域由#pragma omp parallel
的右括号终止,但是并行区域必须在下一次num
次迭代时再次创建。并行方案类似于this。
因此,并行开销(用于创建并行区域)会在每个num
循环中命中程序,而不是仅执行一次。有没有办法让程序不为下一个num
迭代终止创建的并行区域?还是其他任何解决方法?
我无法将此代码并行化为:
#pragma omp parallel for
for (num = 0; num < NUM_DATA; num++) {
{
for (i = 0; i < NUM_AB; i++) {
A[i] = some_calc(data[num], B[i]);
}
for (i = 0; i < NUM_AB; i++) {
B[i] = other_calc(A[i]);
}
}
}
因为B
中some_calc()
用于任何num
次迭代,取决于之前other_calc()
次迭代的num-1
。