我想知道使用 openMP 使这个循环并行是否可行。
粗略地说,存在竞争条件的问题。我不确定如何处理由外循环生成的内循环中的 n 以及其中 D=A[n] 的竞争条件。您认为尝试将其平行化是否可行?
for(n=0; n < 10000000; ++n) {
for (n2=0; n2< 100; ++n2) {
A[n]=A[n]+B[n2][n+C[n2]+200];
}
D=D+A[n];
}
最佳答案
是的,假设没有任何指针是别名,这确实是可并行的。
int D = 0; // Or whatever the type is.
#pragma omp parallel for reduction(+:D) private(n2)
for (n=0; n < 10000000; ++n) {
for (n2 = 0; n2 < 100; ++n2) {
A[n] = A[n] + B[n2][n + C[n2] + 200];
}
D += A[n];
}
它实际上可以进行如下优化:
int D = 0; // Or whatever the type is.
#pragma omp parallel for reduction(+:D) private(n2)
for (n=0; n < 10000000; ++n) {
int tmp = A[n]
for (n2 = 0; n2 < 100; ++n2) {
tmp += B[n2][n + C[n2] + 200];
}
A[n] = tmp;
D += tmp;
}
关于c++ - 我如何在这个循环中使用 openMP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8662888/