砍猪佩琪 2023-10-17 11:17 采纳率: 33.3%
浏览 25
已结题

MPI非阻塞集体通信速度慢

MPI非阻塞集体通信速度慢
问题描述:我在编写mpi并行程序,使用的通信方式是非阻塞式的广播,也就是MPI_IBCAST函数。按照官方文档的说明,非阻塞通信可以将通信过程与计算过程进行重叠,来提升程序运行速度,但是我在实测的时候发现并不是,因为我需要调用MPI_WAIT函数来确认本次通信是否完成,而MPI_WAIT函数本身就会花费大量的时间(甚至已经超过了通信时间),请问各位,MPI_IBCAST与MPI_WAIT函数应该如何使用才能提高效率?
下面是我的测试代码(代码是fortran写的):

program main
    use mpi
    implicit none
    integer i,j
    real(8)::tmp(300000)
    integer ::ierr,my_id
    integer time_begin,time_end,rate
    integer rank,tag, comm
    integer :: status(10000,MPI_STATUS_SIZE)
    integer :: mpi_request1(10000)
    call MPI_INIT( ierr )
    call MPI_COMM_RANK (MPI_COMM_WORLD, my_id, ierr)

    !数组初始化,由0进程进行赋值操作
    if(my_id == 0)then
        do i = 1 ,300000
                tmp(i) = 12.456+i * 4 +45*i
        end do
    end if
    !进行非阻塞通信,并就时间
    call SYSTEM_CLOCK(time_begin,rate)
    do i = 1,10000
       call MPI_IBCAST(tmp(1), 300000, MPI_REAL8, 0, MPI_COMM_WORLD,mpi_request1(i),ierr) 
    end do
    call SYSTEM_CLOCK(time_end,rate)

    call SYSTEM_CLOCK(time_begin,rate)
    !此处调用waitall函数所花费的时间很长,接近二十秒,我直接使用阻塞通信MPI_BCAST都用不了这么久
    call MPI_WaitALL(10000,mpi_request1(1:10000),status(1:10000,:),ierr)
    call SYSTEM_CLOCK(time_end,rate)

    call MPI_FINALIZE ( ierr )
    end program
  • 写回答

11条回答 默认 最新

  • 地球屋里老师 2023-10-17 12:32
    关注

    你的测试例子不合适,原因:1、在单节点上测试,通信时间比多节点短;2、数据传输量不大,通信耗时少;3、后续缺少计算,无法实现通信和计算重叠,体现不了异步的优势。
    改进:搞一个大数组,约500M进行传输。传输完了进行10s以上的计算任务。

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

报告相同问题?

问题事件

  • 系统已结题 10月30日
  • 已采纳回答 10月22日
  • 创建了问题 10月17日