我不认为以下do concurrent
Fortran循环有效,因为acc
在每次迭代中都被修改。但是,gfortran没有给我任何警告,acc
的结果值在55时是正确的。它是否有效?
integer :: acc, i
acc = 0
do concurrent (i=1:10)
acc = acc + i
end do
答案 0 :(得分:3)
循环确实无效。在这种情况下,编译器不需要检测到这一点并报告原因。
在Fortran 2008 8.1.6.5('对DO CONCURRENT构造的限制')中,我们有一个限制:
迭代中引用的变量应在该迭代期间预先定义,或者在任何其他迭代期间不得定义或变为未定义。当循环终止时,由多个迭代定义或变为未定义的变量将变为未定义。
acc
是一个变量,它被多次迭代(所有这些)定义(位于内部赋值语句的左侧)。因此循环是一个错误的循环(并且循环结构acc
的末尾未定义,因此检查其值也是顽皮的。)