我想使用fortran协同数组功能在不同图像上具有不同大小的数组。
遵循2008/2018标准,这应该可以通过使用包含可分配的派生类型来实现。我在macOS Mojave上使用带有opencoarrays 2.3.1.1 MPI库的gfortran 8.2.0。
program Main
implicit none
type :: Array_Type
double precision, dimension(:), allocatable :: values
end type
type(Array_Type), codimension[*] :: array
if(this_image() == 1) then
allocate(array%values(2))
array%values = this_image()
else
allocate(array%values(1))
endif
sync all
print *, this_image(), array[1]%values(:)
sync all
end program
该程序由
gfortran -Wall -fcoarray=lib Main.f90 -lcaf_mpi
当分配的数组被其他镜像访问时,一个甚至更简单的示例也会导致相同的分段错误。
program Main
implicit none
type :: Array_Type
double precision, dimension(:), allocatable :: values
end type
type(Array_Type), codimension[*] :: array
allocate(array%values(2))
sync all
print *, this_image(), array[1]%values(:)
sync all
end program
最佳答案
解决方案
只要在OpenCoarrays中使用MPICH而不是默认的OpenMpi,代码就可以在指定的系统上正常工作。
此外,应使用OpenCoarrays编译器包装器:caf Main.f90
我在OpenCoarrays GitHub网站上打开了一个问题:https://github.com/sourceryinstitute/OpenCoarrays/issues/625
关于fortran - 当从不同的图像访问时,为什么与可分配组件协同排列会产生分割错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54067382/