我正在学习OpenMP,并且遇到了以下示例:
#pragma omp parallel shared(n,a,b,c,d,sum) private(i) { #pragma omp for nowait for (i=0; i<n; i++) a[i] += b[i]; #pragma omp for nowait for (i=0; i<n; i++) c[i] += d[i]; #pragma omp barrier #pragma omp for nowait reduction(+:sum) for (i=0; i<n; i++) sum += a[i] + c[i]; } /*-- End of parallel region --*/
在最后一个循环中,有一个现在和一个减少条款.它是否正确?缩减条款是否不需要同步化?
解决方法
第二个和最后一个循环中的现在有点多余. OpenMP规范现在在区域结束之前提到,所以也许这可以留在.
但是,在第二个循环之前的现在以及它之后的明显障碍是多余的.
特别是没有必要减少.
此外,共享和私有子句在C中是不必要的:shared是多余的,private不应该被使用.如果你需要一个线程私有变量,只需在并行区域内声明它.特别是在C中,你应该在循环中声明循环变量,而不是之前.
#pragma omp parallel { #pragma omp for nowait for (int i = 0; i < n; ++i) a[i] += b[i]; #pragma omp for for (int i = 0; i < n; ++i) c[i] += d[i]; #pragma omp for nowait reduction(+:sum) for (int i = 0; i < n; ++i) sum += a[i] + c[i]; } // End of parallel region