走不心 发表于 2023-7-5 14:54:59

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

[*]

    end do

[*]



[*]

call MPI_BARRIER(MPI_COMM_WORLD,ierr)

[*]

call MPI_FINALIZE(IERR)

[*]



[*]

end program


页: [1]
查看完整版本: mpi3分配共享内存的次数是否有限制