为什么具有可分配组件的 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