gfortran中associate与forall联用的版本兼容及标准合规性问询
Fortran中
forall与associate联用的编译器支持及标准合规性问题 问题场景
我尝试用两个不同版本的gfortran编译以下Fortran程序:
program main integer, dimension(1:2) :: iii real, dimension(1:4,1:4,1:2) :: myArray associate(iix => iii(1), iiy=> iii(2) ) forall( iix=1:4, iiy=1:4 ) myArray(iix,iiy,1) = iix + iiy myArray(iix,iiy,2) = (iix + iiy)*10 endforall end associate print *, myArray(:,:,1) print *, myArray(:,:,2) end program main
- 使用**GNU Fortran (GCC) 12.1.1 20220507 (Red Hat 12.1.1-1)**编译无任何问题;
- 使用GNU Fortran (Debian 10.2.1-6) 10.2.1 20210110编译时触发内部编译器错误:
7 | forall( iix=1:4, iiy=1:4 ) | 1 internal compiler error: Segmentation fault
我有两个核心疑问:
- 从哪个gfortran版本开始支持在
forall语句中使用associate关联的名称? - 这段程序是否符合Fortran标准?
替代可行方案
将forall替换为嵌套do循环后,两个版本的编译器都能正常编译运行,代码如下:
integer, dimension(1:2) :: iii real, dimension(1:4,1:4,1:2) :: myArray associate(iix => iii(1), iiy=> iii(2) ) do iix = 1,4 do iiy = 1,4 myArray(iix,iiy,1) = iix + iiy myArray(iix,iiy,2) = (iix + iiy)*10 enddo enddo end associate print *, myArray(:,:,1) print *, myArray(:,:,2) end program main
补充完整代码
根据后续补充,初始代码中associate与forall之间还有一层do循环,完整代码如下:
program main integer, dimension(1:2) :: iii real, dimension(1:4,1:4,1:2) :: myArray integer :: i myArray = 0.0 associate( iix => iii(1), iiy => iii(2) ) do i=1,2 forall( iix=1:4, iiy=1:4 ) myArray(iix,iiy,i) = (iix+iiy)*10*i endforall enddo end associate print *, myArray(:,:,1) print *, myArray(:,:,2) end program main
解答
1. 程序的标准合规性
这段代码完全符合Fortran标准。associate块的关联名称可以被forall语句的索引变量覆盖,因为forall的索引变量是该语句的局部变量,作用域仅限forall内部,不会与associate的关联名称产生冲突,这是Fortran标准允许的用法。
2. gfortran版本支持情况
你遇到的是gfortran 10.x版本的内部编译器错误(ICE),这是编译器自身的bug,而非代码不符合标准。该bug在gfortran 11版本中已被修复,因此从gfortran 11开始,能够正常编译这类associate与forall联用的代码。
内容的提问来源于stack exchange,提问作者Stef1611
相关产品推荐
相关产品推荐

