MPI_WIN_ALLOCATE_SHARED: память ограничена? - PullRequest
1 голос
/ 04 апреля 2019

Кажется, что когда я пытаюсь выделить окно размером около 30-32 Мб, я получаю ошибку сегментации?

Я использую следующую процедуру MPI_WIN_ALLOCATE_SHARED

Кто-нибудь знает, есть ли предел размера моего окна? Если так, есть ли способ скомпилировать мой код, ослабив этот предел?

Я использую INTEL MPI 19.0.3 и ifort 19.0.3 -

Пример написан на фортране. Изменяя целое число size_, вы можете видеть, когда происходит ошибка сегментации. Я протестировал его с size_=10e3 и size_=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

Эта оболочка связана с моим ifort 19.0.3 и библиотекой Intel MPI. Это было проверено, запустив mpif90 -v

и быть очень точным my mpif90 - это символическая ссылка на мою mpiifort оболочку. Это сделано для личного удобства, но не должно вызывать проблем, я думаю?

Ответы [ 2 ]

3 голосов
/ 04 апреля 2019

В руководстве говорится, что вызов 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_unit и baseptr не совпадают в вашей программе.

1 голос
/ 05 апреля 2019

Я наконец смог диагностировать, откуда возникла ошибка.

В коде у меня есть

  disp_unit  = MPI_REAL
  size_bytes = size_*disp_unit

MPI_REAL - это константа / параметр, определяемый MPI, а не равен , равному 4, как я очень ошибочно ожидал (4 для 4 байтов для одинарной точности) !. В моей версии он установлен на 1275069468, что, скорее всего, относится к идентификатору, а не к любому разумному числу. Следовательно, умножение этого числа на размер моего массива может очень быстро превысить доступную память, но также и количество цифр, которое может быть представлено целым байтом

...