2

我不认为下面的do concurrentFortran 循环是有效的,因为acc每次迭代都会修改。但是,gfortran 没有给我任何警告,并且结果值在acc55 处是正确的。它是否有效?

integer :: acc, i
acc = 0
do concurrent (i=1:10)
    acc = acc + i
end do
4

1 回答 1

4

该循环确实无效。在这种情况下,编译器不需要检测并报告原因。

在 Fortran 2008 8.1.6.5('对 DO CONCURRENT 结构的限制')中,我们有一个限制:

在迭代中引用的变量应在该迭代期间预先定义,或者在任何其他迭代期间不应定义或变为未定义。通过多次迭代定义或变为未定义的变量在循环终止时变为未定义。

acc是这样一个变量,它被不止一次的迭代(全部)定义(位于内在赋值语句的左侧)。因此,循环是一个糟糕的循环(并且在循环结构的末尾acc是未定义的,因此检查它的值也很顽皮)。

于 2017-02-21T21:25:06.290 回答