OpenMP:同一编译指示上的nowait和reduce子句
||
我正在研究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 --*/
在最后一个for循环中,有一个nowait和reduce子句。它是否正确?归约条款是否需要同步化?
没有找到相关结果
已邀请:
3 个回复
琳娘
和
子句。在您的代码中,“ 4”无效,而根本不应该使用“ 5”:如果需要线程专用变量,只需在并行区域内声明即可。特别是,您应该在循环内部而不是之前声明循环变量。 要使“ 4”有用,您需要告诉OpenMP默认情况下不应共享任何内容。您应该这样做以避免由于意外共享变量而导致的错误。通过指定
来完成。这给我们留下了:
攫怂绵十
郡晒景沧
where子句是以下之一:
因此,可以有更多的子句,因此可以同时有reduce和nowait语句。
子句中不需要显式同步-由于
和先前的屏障力
和
在
循环时具有最终值,因此对
变量的添加是同步的。 “ 1”表示如果线程在循环中完成工作,则不必等待所有其他线程都将完成同一循环。