我在这里有一些代码片段,我认为正确的答案并没有给出。我需要一些帮助来澄清这一点。
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?
答案 0 :(得分:0)
reduction
子句将dotp
标记为共享并执行最终求和。
for循环中每个共享dotp
的初始值为0.汇总的最后一步是添加dotp
的先前版本(原始)值,在这种情况下,这是0但它可能是任何价值。
您不需要(也不应该)说它首先是私有的,以强制执行dotp
的初始归零。