Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran MPI_WIN_ALLOCATE_SHARED:内存有限?_Fortran_Mpi_Shared Memory - Fatal编程技术网

Fortran MPI_WIN_ALLOCATE_SHARED:内存有限?

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------

似乎每当我试图分配一个30-32MB左右的窗口时,就会出现分段错误

我正在使用以下例行程序MPI\u WIN\u ALLOCATE\u SHARED

有人知道我的窗户有多大是有限制的吗?如果是这样的话,有没有一种方法可以编译我的代码来放宽这个限制

我使用的是英特尔MPI 19.0.3和ifort 19.0.3-

用Fortran编写的示例。通过改变整数大小,您可以看到分段错误发生的时间。我用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测试_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数据类型变量和常量是句柄,这是一个很大的主题。其中一些是预定义的,但通常可以再次创建、提交和释放它们。数字只是这样一种类型的句柄,它可能是向量、子数组等的复杂结构。。。这是一个很大的话题