Parallel processing 什么时候开始$OMP平行端有必要吗?
OpenMP规范指出,[!$OMP PARALLEL END DO]是可选的,如果不存在,编译器将默认使用它。我可以隐式地假定它是正确的吗?比如说 版本1:(无端平行do) 版本2:(端部平行do)Parallel processing 什么时候开始$OMP平行端有必要吗?,parallel-processing,fortran,openmp,Parallel Processing,Fortran,Openmp,OpenMP规范指出,[!$OMP PARALLEL END DO]是可选的,如果不存在,编译器将默认使用它。我可以隐式地假定它是正确的吗?比如说 版本1:(无端平行do) 版本2:(端部平行do) 尽管说明书上说它是可选的(安全的),但实际上它有多安全(对于上面的例子)?您的体验是什么?使用安全吗?@Vogt我的MPI+OpenMP代码有问题,并将问题隔离到我的解算器中的上述代码段。我不确定这是否是罪魁祸首,需要进一步调查以确认。@Vogt我还看到OMP规范中提供的所有示例都有一个$OMP端部
尽管说明书上说它是可选的(安全的),但实际上它有多安全(对于上面的例子)?您的体验是什么?使用安全吗?@Vogt我的MPI+OpenMP代码有问题,并将问题隔离到我的解算器中的上述代码段。我不确定这是否是罪魁祸首,需要进一步调查以确认。@Vogt我还看到OMP规范中提供的所有示例都有一个$OMP端部平行DO(DO还原除外)。没有一个例子没有它,更不确定,更怀疑它的安全性。我想不出哪一个例子省略它会有什么不同。但是我不喜欢在上面分享j,你能展示一下你认为导致问题的真正代码吗?@Ian Bush:j不是共享的。请参阅OpenMP4.5标准(与以前的版本相同,但我手头有4.5),p57第14行“如果任何循环迭代变量都是共享的,则它们在循环构造中被隐式设置为私有。”
do i = 1, N
!$OMP PARALLEL DO DEFAULT(SHARED)
do j = xadj(i), xadj(i+1) - 1
call residual(j, ...)
end do
end do
do i = 1, N
!$OMP PARALLEL DO DEFAULT(SHARED)
do j = xadj(i), xadj(i+1) - 1
call residual(j, ...)
end do
!$OMP END PARALLEL DO
end do