我正在为一些 MPI 分散/收集例程使用一些现代 Fortran 包装器。我试图有一个包装器接口,它在输入上只有一个数组,并在输出上返回 MPI 操作的结果,对于几个派生类型,执行如下操作:
type(mytype), allocatable :: chunk(:),whole(:)
! [...] chunk descends from previous parts of the code
! Get global array
whole = gatherv(array=chunk,receiver_node=cpuid)
我正在使用返回allocatable
数组的函数来执行此操作。gcc 6.2.0
但是,gcc 7.1.0
每当我返回未分配的结果时,我都会遇到分段错误。
我需要未分配结果的原因是有时我只需要在指定的 CPU 上收集整个数组,所以我不想在所有其他节点上浪费内存:接收节点返回一个带有数据的已分配数组,并且所有其他节点都会收到一个空且已释放的数组。
这是重现该问题的示例代码:
program test_allocatable_fun
implicit none
integer, allocatable :: my_array(:)
integer :: n
n = 3; my_array = unallocated_array(n); print *, 'n=',n,' allocated(array)=',allocated(my_array)
n =-3; my_array = unallocated_array(n); print *, 'n=',n,' allocated(array)=',allocated(my_array)
n = 5; my_array = unallocated_array(n); print *, 'n=',n,' allocated(array)=',allocated(my_array)
n = 0; my_array = unallocated_array(n); print *, 'n=',n,' allocated(array)=',allocated(my_array)
return
contains
function unallocated_array(n) result(array)
integer, intent(in) :: n
integer, allocatable :: array(:)
integer :: j
if (n>0) then
allocate(array(n))
array(:) = [(j,j=1,n)]
else
if (allocated(array)) deallocate(array)
end if
end function unallocated_array
end program test_allocatable_fun
分段错误发生在分配行,即:
my_array = unallocated_array(n)
你们以前有过同样的问题吗?或者,我是否违反了标准中的任何内容?我不明白为什么应该强制返回可分配数组的函数分配返回值。intent(out)
这和在子程序中有一个虚拟变量不一样吗?