Fortran MPI_WIN_ALLOCATE_SHARED:内存有限?
似乎每当我试图分配一个30-32MB左右的窗口时,就会出现分段错误 我正在使用以下例行程序MPI\u WIN\u ALLOCATE\u SHARED 有人知道我的窗户有多大是有限制的吗?如果是这样的话,有没有一种方法可以编译我的代码来放宽这个限制 我使用的是英特尔MPI 19.0.3和ifort 19.0.3- 用Fortran编写的示例。通过改变整数大小,您可以看到分段错误发生的时间。我用size_=10e3和size_=10e4对它进行了测试,后者导致了分割错误Fortran MPI_WIN_ALLOCATE_SHARED:内存有限?,fortran,mpi,shared-memory,Fortran,Mpi,Shared Memory,似乎每当我试图分配一个30-32MB左右的窗口时,就会出现分段错误 我正在使用以下例行程序MPI\u WIN\u ALLOCATE\u SHARED 有人知道我的窗户有多大是有限制的吗?如果是这样的话,有没有一种方法可以编译我的代码来放宽这个限制 我使用的是英特尔MPI 19.0.3和ifort 19.0.3- 用Fortran编写的示例。通过改变整数大小,您可以看到分段错误发生的时间。我用size_=10e3和size_=10e4对它进行了测试,后者导致了分割错误 C------
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测试_stack.f90;mpirun-np 2./a.out
此包装器链接到我的ifort 19.0.3和英特尔MPI库。这已通过运行验证
mpif90-v
更确切地说,我的mpif90是指向我的mpiifort包装的符号链接。这是为了个人方便,但我想不应该引起问题?手册上说,调用MPI\u WIN\u ALLOCATE\u 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\U单元和baseptr的类型不匹配。手册中说,调用MPI\U WIN\U ALLOCATE\U 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_单元和baseptr的类型不匹配。我终于能够诊断错误的来源 在我的代码中
disp_unit = MPI_REAL
size_bytes = size_*disp_unit
MPI_REAL是一个由MPI定义的常量/参数,它不等于4,因为对于单精度,我非常错误地期望4个字节为4!。在我的版本中,它被设置为1275069468,这很可能是指一个id,而不是任何合理的数字。
因此,将这个数字与数组的大小相乘可能会很快超出可用内存,但也会超出可以用字节整数表示的位数,我最终能够诊断错误的来源 在我的代码中
disp_unit = MPI_REAL
size_bytes = size_*disp_unit
MPI_REAL是一个由MPI定义的常量/参数,它不等于4,因为对于单精度,我非常错误地期望4个字节为4!。在我的版本中,它被设置为1275069468,这很可能是指一个id,而不是任何合理的数字。
因此,将此数字与我的数组大小相乘可能会很快超出可用内存,但可以用字节整数表示的位数也包括您的MPI库供应商和版本、限制(如果有),可能依赖于实现。事实上,在这种情况下,您应该使用mpi_f08-您不应该在旧表单中使用c_ptr类型,并且您现在不应该使用include文件,模块应该使用D'oh,当然,如果您使用mpi_f08,您应该使用适当的mpi派生类型作为well@IanBush,使用use mpi应该对此完全有效?@A2LBK不,你永远不能说use mpi会捕获你的错误,这根本不是真的。你必须仔细检查通话的正确性。每个参数一个接一个。还包括您的MPI库供应商和版本,限制(如果有)可能取决于实现。事实上,在这种情况下,您应该使用MPI_f08-您不应该在旧表单中使用c_ptr类型,您现在不应该使用include文件,模块应该使用D'oh,当然,如果您使用mpi_f08,您应该使用适当的mpi派生类型作为well@IanBush,使用mpi应该对此完全有效?@A2LBK不,你永远不能说使用mpi会捕获你的错误,这根本不是真的。你必须仔细检查通话的正确性。每个论点一个接一个。这不能解决问题吗?作为旁注:我看到一些课程材料确实将typec_ptr与使用mpi结合使用。尽管,可能最好严格遵守手册,担心disp_单元,我本打算将其声明为一个整数,但没有类似的东西。但即使将baseptr声明为整数,错误仍然存在。@A2LBK该问题可能存在于disp_单元中,INTEGERKIND=MPI_ADDRESS_KIND通常与typec_ptr二进制兼容。@A2LBK对我来说不会崩溃。@A2LBK在我向程序添加MPI_finalize后的1、2或8个过程中对我来说都不会崩溃,没有它的崩溃不是segv。将gfortran 8.2.0与openmpi 4.0.0一起使用,但这并不能解决问题?作为旁注:我看到一些课程材料确实将typec_ptr与使用mpi结合使用。尽管,可能最好严格遵守手册,担心disp_单元,我本打算将其声明为一个整数,但没有类似的东西。但即使将baseptr声明为整数,错误仍然存在。@A2LBK该问题可能存在于disp_单元中,INTEGERKIND=MPI_ADDRESS_KIND通常与typec_ptr二进制兼容。@A2LBK对我来说不会崩溃。@A2LBK在我向程序添加MPI_finalize后的1、2或8个过程中对我来说都不会崩溃,没有它的崩溃不是segv。使用gfortran 8.2.0和openmpi 4.0.0,MPI数据类型变量和常量是句柄。其中一些是预定义的,但通常可以创建、提交和释放它们
再一次数字只是这样一种类型的句柄,它可能是向量、子数组等的复杂结构。。。MPI数据类型变量和常量是句柄,这是一个很大的主题。其中一些是预定义的,但通常可以再次创建、提交和释放它们。数字只是这样一种类型的句柄,它可能是向量、子数组等的复杂结构。。。这是一个很大的话题