为什么具有可分配组件的 coarray 在从不同图像访问时会产生分割错误?
Why does coarray with allocatable component creates segmentation faults when accessed from different image?
我想使用 fortran coarray 功能在不同的图像上使用不同大小的数组。
根据 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
解决方案
只要将 MPICH 而不是默认的 OpenMpi 与 OpenCoarrays 一起使用,代码就可以在指定的系统上正常工作。
此外,应该使用 OpenCoarrays 编译器包装器:caf Main.f90
我在 OpenCoarrays GitHub 网站上开了一个问题:https://github.com/sourceryinstitute/OpenCoarrays/issues/625
我想使用 fortran coarray 功能在不同的图像上使用不同大小的数组。
根据 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
解决方案
只要将 MPICH 而不是默认的 OpenMpi 与 OpenCoarrays 一起使用,代码就可以在指定的系统上正常工作。
此外,应该使用 OpenCoarrays 编译器包装器:caf Main.f90
我在 OpenCoarrays GitHub 网站上开了一个问题:https://github.com/sourceryinstitute/OpenCoarrays/issues/625