Fortran Coder

查看: 2040|回复: 0
打印 上一主题 下一主题

[通用算法] mpi3分配共享内存的次数是否有限制

[复制链接]

10

帖子

4

主题

0

精华

入门

F 币
31 元
贡献
22 点
跳转到指定楼层
楼主
发表于 2023-7-5 14:54:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
15F 币
我在使用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


分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-24 07:52

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表