当从不同的图像访问时,为什么与可分配组件协同排列会产生分割错误?

时间:2019-01-07 00:55:06

标签: fortran gfortran fortran-coarrays

我想使用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

1 个答案:

答案 0 :(得分:1)

解决方案

只要在OpenCoarrays中使用MPICH而不是默认的OpenMpi,代码就可以在指定的系统上正常工作。

另外,应使用OpenCoarrays编译器包装器:caf Main.f90

我在OpenCoarrays GitHub网站上打开了一个问题:https://github.com/sourceryinstitute/OpenCoarrays/issues/625