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

10-11 18:06