砍猪佩琪 2023-07-05 14:40 采纳率: 33.3%
浏览 45
已结题

mpi3分配共享内存的次数是否有限制

mpi3共享内存错误
我在使用mpi3中的共享内存,需要在各个进程中共享的是很多个小矩阵块(大约2300个),当我第2045次调用MPI_Win_allocate_shared函数后,会报错access violation,一开始我以为是分配了太多导致内存不够了,于是我将每个矩阵块的大小设置为2*2,结果当我第2045次调用MPI_Win_allocate_shared时仍然会报错access violation。不知道有没有做过相关问题的朋友能帮忙分析一下问题,下面是我的代码

program sharedmemtest
  USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR, C_F_POINTER
  use mpi
  !use global_parameter
  implicit none
  integer, parameter :: dp = selected_real_kind(14,200)
  integer ::hostcomm,hostrank
  INTEGER(KIND=MPI_ADDRESS_KIND) :: windowsize
  INTEGER :: disp_unit,my_rank,ierr,total
  integer i,size
  TYPE(C_PTR) ,allocatable:: baseptr(:)
  type matrix !新定义一个复数矩阵类型
      complex(8),pointer :: mat(:,:)
  end type !=========================
  TYPE(matrix),pointer :: NF_group_pair(:)
  
integer ,allocatable::win(:)
  call MPI_INIT( ierr )
  call MPI_COMM_RANK(MPI_COMM_WORLD,MY_RANK,IERR)
  call MPI_COMM_SIZE(MPI_COMM_WORLD,Total,IERR)
  CALL MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, 0, MPI_INFO_NULL, hostcomm,ierr)
  CALL MPI_Comm_rank(hostcomm, hostrank,ierr)
  
    allocate(NF_group_pair(2300))
    allocate(win(2300),baseptr(2300))
    if (hostrank == 0) then
        windowsize = int(2**2,MPI_ADDRESS_KIND)*16_MPI_ADDRESS_KIND
    else
        windowsize = 0_MPI_ADDRESS_KIND
    end if
        disp_unit = 1
  !此处是循环分配共享内存,但是在第2045次的时候就会报错
    do i = 1,2300
        CALL MPI_Win_allocate_shared(windowsize, disp_unit, MPI_INFO_NULL, hostcomm, baseptr(i), win(i), ierr)
        if (hostrank /= 0) then
           CALL MPI_Win_shared_query(win(i),  0, windowsize, disp_unit, baseptr(i),  ierr)
        end if
        CALL C_F_POINTER(baseptr(i), NF_group_pair(i)%mat,[2,2])
    end do

  call MPI_BARRIER(MPI_COMM_WORLD,ierr) 
  call MPI_FINALIZE(IERR)

  end program

  • 写回答

2条回答 默认 最新

  • PhoenixRiser 2023-07-05 15:06
    关注
    • MPI窗口数量上限了。你在循环中给每个矩阵都创建了一个新的窗口,导致在2045次时窗口数量达到了限制。
    • 创建一个不就行了,然后在窗口中给所有的矩阵分配内存。代码修改如下:
    program sharedmemtest
      USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR, C_F_POINTER
      use mpi
      implicit none
      integer, parameter :: dp = selected_real_kind(14,200)
      integer ::hostcomm,hostrank
      INTEGER(KIND=MPI_ADDRESS_KIND) :: windowsize
      INTEGER :: disp_unit,my_rank,ierr,total
      integer i,size
      TYPE(C_PTR) :: baseptr
      type matrix !新定义一个复数矩阵类型
          complex(8),pointer :: mat(:,:)
      end type !=========================
      TYPE(matrix),pointer :: NF_group_pair(:)
      INTEGER :: win
      call MPI_INIT( ierr )
      call MPI_COMM_RANK(MPI_COMM_WORLD,MY_RANK,IERR)
      call MPI_COMM_SIZE(MPI_COMM_WORLD,Total,IERR)
      CALL MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, 0, MPI_INFO_NULL, hostcomm,ierr)
      CALL MPI_Comm_rank(hostcomm, hostrank,ierr)
        allocate(NF_group_pair(2300))
        if (hostrank == 0) then
            windowsize = int(2**2,MPI_ADDRESS_KIND)*16_MPI_ADDRESS_KIND*2300
        else
            windowsize = 0_MPI_ADDRESS_KIND
        end if
        disp_unit = 1
        CALL MPI_Win_allocate_shared(windowsize, disp_unit, MPI_INFO_NULL, hostcomm, baseptr, win, ierr)
        if (hostrank /= 0) then
           CALL MPI_Win_shared_query(win,  0, windowsize, disp_unit, baseptr,  ierr)
        end if
        do i = 1,2300
            CALL C_F_POINTER(baseptr, NF_group_pair(i)%mat,[2,2])
            baseptr = C_PTRADD(baseptr, 2**2*16)
        end do
      call MPI_BARRIER(MPI_COMM_WORLD,ierr) 
      call MPI_FINALIZE(IERR)
      end program
    

    只在一个窗口中给所有的矩阵分配内存,再通过C_PTRADD函数移动指针的位置,获取每个矩阵的内存地址。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月15日
  • 已采纳回答 7月7日
  • 创建了问题 7月5日

悬赏问题

  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题