我不认为下面的do concurrent
Fortran 循环有效,如下所示acc
在每次迭代中都会被修改。但是,gfortran 没有给我任何类型的警告,并且结果值acc
正确的是 55。它是否有效?
integer :: acc, i
acc = 0
do concurrent (i=1:10)
acc = acc + i
end do
循环确实无效。在这种情况下,编译器不需要检测这一点并报告原因。
在 Fortran 2008 8.1.6.5(“DO CONCURRENT 构造的限制”)中,我们有以下一项限制:
迭代中引用的变量应在该迭代期间预先定义,或者在任何其他迭代期间不应定义或变为未定义。当循环终止时,通过多次迭代定义或变为未定义的变量将变为未定义。
acc
是这样一个变量,它通过多次迭代(所有迭代)来定义(位于内部赋值语句的左侧)。因此,该循环是一个糟糕的循环(并且在循环构造的末尾acc
是未定义的,所以检查它的值也是很顽皮的)。
正如评论中所指出的,与其他无效的 Fortran 程序类似,您可能仍然会在这里得到正确的答案,而没有任何抱怨。在这种情况下,DO CONCURRENT 构造可以以与普通 DO 构造完全相同的方式实现,以给出完全相同的答案。仅当并行运行时(例如使用自动并行化或在 GPU 上)或进行非常严格的编译器检查时,数据依赖性才会导致竞争条件和错误答案或中止。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)