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_=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
此包装器 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_unit
和 baseptr
的类型在您的程序中不匹配。
我终于能够诊断出错误的根源。
在我的代码中
disp_unit = MPI_REAL
size_bytes = size_*disp_unit
MPI_REAL
是由 MPI 定义的 constant/parameter 并且 不是 等于 4 正如我非常错误地预期的那样(单精度 4 个字节为 4) !。在我的版本中,它被设置为 1275069468
,这很可能是指一个 id 而不是任何合理的数字。
因此,将这个数字与我的数组大小相乘会很快超过可用内存,而且还会超过字节整数可以表示的位数
似乎每当我尝试分配一个大约 30-32 Mb 的 window 时,我都会遇到分段错误?
我正在使用以下程序 MPI_WIN_ALLOCATE_SHARED
有人知道我的 window 有多大限制吗?如果是这样,有没有办法编译我的代码以放宽该限制?
我正在使用 INTEL MPI 19.0.3 和 ifort 19.0.3 -
用 Fortran 编写的示例。通过改变整数 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
此包装器 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_unit
和 baseptr
的类型在您的程序中不匹配。
我终于能够诊断出错误的根源。
在我的代码中
disp_unit = MPI_REAL
size_bytes = size_*disp_unit
MPI_REAL
是由 MPI 定义的 constant/parameter 并且 不是 等于 4 正如我非常错误地预期的那样(单精度 4 个字节为 4) !。在我的版本中,它被设置为 1275069468
,这很可能是指一个 id 而不是任何合理的数字。
因此,将这个数字与我的数组大小相乘会很快超过可用内存,而且还会超过字节整数可以表示的位数