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