MPI_WIN_ALLOCATE_SHARED: 内存有限?

MPI_WIN_ALLOCATE_SHARED: memory limited?

似乎每当我尝试分配一个大约 30-32 Mb 的 window 时,我都会遇到分段错误?

我正在使用以下程序 MPI_WIN_ALLOCATE_SHARED

有人知道我的 window 有多大限制吗?如果是这样,有没有办法编译我的代码以放宽该限制?

我正在使用 INTEL MPI 19.0.3 和 ifort 19.0.3 -

用 Fortran 编写的示例。通过改变整数 size_,您可以看到分段错误何时发生。我用 size_=10e3size_=10e4 测试了它,后者导致了分段错误

C------
      program TEST_STACK
      use, INTRINSIC ::ISO_C_BINDING

      implicit none
      include 'mpif.h'

      !---  Parameters (They should not be changed ! )
      integer, parameter   :: whoisroot   = 0  ! - Root always 0 here
      !---  General parallel
      integer              :: whoami                 ! - My rank
      integer              :: mpi_nproc              ! - no. of procs
      integer              :: mpierr                 ! - Error status
      integer              :: status(MPI_STATUS_SIZE)! - For MPI_RECV
      !---  Shared memory stuff
      integer              :: whoami_shm             ! - Local rank in shared memory group
      integer              :: mpi_shm_nproc          ! - No. of procs in Shared memory group
      integer              :: no_partners            ! - No. of partners for share memory
      integer              :: info_alloc
      !---  MPI groups
      integer              :: world_group            ! - All procs across all nodes
      integer              :: shared_group           ! - Only procs that share memory
      integer              :: MPI_COMM_SHM           ! - Shared memory communicators (for those in shared_group)

      type(C_PTR)                         :: ptr_buf
      integer(kind = MPI_ADDRESS_KIND)    :: size_bytes, lb
      integer                             :: win, size_, disp_unit

      call MPI_INIT        ( mpierr )
      call MPI_COMM_RANK   ( MPI_COMM_WORLD, whoami, mpierr )

      call MPI_COMM_RANK   ( MPI_COMM_WORLD, whoami, mpierr )
      call MPI_COMM_SIZE   ( MPI_COMM_WORLD, mpi_nproc, mpierr)
      call MPI_COMM_SPLIT_TYPE( MPI_COMM_WORLD
     &                        , MPI_COMM_TYPE_SHARED
     &                        , 0
     &                        , MPI_INFO_NULL
     &                        , MPI_COMM_SHM
     &                        , mpierr )

      call MPI_COMM_RANK( MPI_COMM_SHM, whoami_shm, mpierr )
      call MPI_COMM_SIZE( MPI_COMM_SHM, mpi_shm_nproc, mpierr )
      size_ = 10e4! - seg fault 
      size_bytes = size_ * MPI_REAL
      disp_unit  = MPI_REAL
      size_bytes = size_*disp_unit
      call MPI_INFO_CREATE( info_alloc, mpierr )
      call MPI_INFO_SET( info_alloc
     &                    , "alloc_shared_noncontig"
     &                    , "true"
     &                    , mpierr )
      !


      call MPI_WIN_ALLOCATE_SHARED( size_bytes
     &                            , disp_unit
     &                            , info_alloc
     &                            , MPI_COMM_SHM
     &                            , ptr_buf
     &                            , win
     &                            , mpierr )

      call MPI_WIN_FREE(win, mpierr)


      end program TEST_STACK

我运行我的代码使用以下命令

mpif90 test_stack.f90; mpirun -np 2 ./a.out

此包装器 linked 到我的 ifort 19.0.3 和 Intel MPI 库。 运行ning 对此进行了验证 mpif90 -v

并且非常精确 我的 mpif90 是我的 mpiifort 包装器的象征性 link。这是为了个人方便而设计的,但我想应该不会造成问题?

手册上说 MPI_WIN_ALLOCATE_SHARED 的调用看起来像这样

USE MPI

MPI_WIN_ALLOCATE_SHARED(SIZE, DISP_UNIT, INFO, COMM, BASEPTR, WIN, IERROR)
    INTEGER(KIND=MPI_ADDRESS_KIND) SIZE, BASEPTR
    INTEGER DISP_UNIT, INFO, COMM, WIN, IERROR

至少 disp_unitbaseptr 的类型在您的程序中不匹配。

我终于能够诊断出错误的根源。

在我的代码中

  disp_unit  = MPI_REAL
  size_bytes = size_*disp_unit

MPI_REAL 是由 MPI 定义的 constant/parameter 并且 不是 等于 4 正如我非常错误地预期的那样(单精度 4 个字节为 4) !。在我的版本中,它被设置为 1275069468 ,这很可能是指一个 id 而不是任何合理的数字。 因此,将这个数字与我的数组大小相乘会很快超过可用内存,而且还会超过字节整数可以表示的位数