1

我在这里有一些代码片段,其中我认为正确的没有作为答案给出。我需要一些帮助来澄清这一点。

dotp=0;
for (i=0;i<n;i++){
dotp+= a[i]+b[i];
}

并行化此代码的给定答案是:

dotp=0;
#pragma omp parallel for reduction(+:dotp)
for (i=0;i<n;i++){
dotp+= a[i]+b[i];
}

我认为它需要将 dotp 添加为 firstprivate 才能在 for 循环中可见

dotp=0;
#pragma omp parallel for reduction(+:dotp) firstprivate(dotp)
for (i=0;i<n;i++){
dotp+= a[i]+b[i];
}

如果这不正确,为什么我们不必使用 firstprivate ?

4

1 回答 1

0

reduction子句标记dotp共享并执行最终求和。

for 循环中每个共享的初始值为dotp0。求和的最后一步是添加 的先前版本(原始)值dotp,在您的情况下为 0。但是它可以是任何值。

您不需要(也不应该)说它是第一个私有的,以强制对dotp.

于 2013-05-14T19:37:54.937 回答