避免继续阻止MPI_BCAST

时间:2016-02-17 22:15:52

标签: parallel-processing mpi broadcast

我正在尝试改进我用于数值模拟的代码之一。其中一个计算步骤需要计算几个大型数组,其计算复杂且成本高。现在做的是每个数组由特定的MPI进程计算,然后广播到其他数组。这样做的子程序在程序运行期间经常被调用,因此它需要尽可能快。

然而,我怀疑连续五次MPI_BCAST对程序性能有害......我使用非阻塞BCAST(MPI_IBCAST)做了一些测试,我看到了性能的提高。 不幸的是,我不能使用它似乎在一些MPI实现中似乎不可用(至少安装在集群上的版本我使用...)。

您对如何改善这种情况有什么想法吗?以下是我试图优化的代码的简化版本......

program test
   use mpi 
   integer,       parameter                      :: dp   = kind(0.d0) 
   real(dp), dimension(:), allocatable           :: a, b, c, d, e
   integer, dimension(5)                         :: kproc  

   integer                                       :: myid, numprocs, ierr
   integer                                       :: i,n


   call MPI_INIT(ierr) 
   call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr) 
   call MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr) 

   n = 5000 ! Can be much greater

   allocate(a(n), b(n), c(n), d(n), e(n))
   do i=1,5
     kproc(i)=mod(i-1,numprocs)
   enddo  

   if(myid==kproc(1)) then 
       a = 1.0_dp ! Complex computation for a
   endif
   if(myid==kproc(2)) then 
       b = 2.0_dp ! Complex computation for b
   endif
   if(myid==kproc(3)) then 
       c = 3.0_dp ! Complex computation for c
   endif
   if(myid==kproc(4)) then 
       d = 4.0_dp ! Complex computation for d
   endif
   if(myid==kproc(5)) then 
       e = 5.0_dp ! Complex computation for e
   endif


  call MPI_BCAST(a,n,MPI_DOUBLE_PRECISION,kproc(1),MPI_COMM_WORLD, ierr)
  call MPI_BCAST(b,n,MPI_DOUBLE_PRECISION,kproc(2),MPI_COMM_WORLD ,ierr)
  call MPI_BCAST(c,n,MPI_DOUBLE_PRECISION,kproc(3),MPI_COMM_WORLD ,ierr)
  call MPI_BCAST(d,n,MPI_DOUBLE_PRECISION,kproc(4),MPI_COMM_WORLD ,ierr)
  call MPI_BCAST(e,n,MPI_DOUBLE_PRECISION,kproc(5),MPI_COMM_WORLD ,ierr)
  d = d+e
  call MPI_FINALIZE(ierr) 
end program test

在此示例中,您可以看到五个数组a,b,c,d和e的计算在MPI进程之间进行了分割。另请注意,d和e实际上是同一个数组的两个部分:最后,重要的只是d = d + e的值。

0 个答案:

没有答案