Parallel processing 避免连续阻塞MPI\u BCAST

Parallel processing 避免连续阻塞MPI\u BCAST,parallel-processing,mpi,broadcast,Parallel Processing,Mpi,Broadcast,我正在尝试改进我用于数值模拟的一个代码。其中一个计算步骤需要计算多个大型阵列,这些阵列的计算既复杂又昂贵。现在要做的是,每个数组由特定的MPI进程计算,然后广播到其他数组。这样做的子程序在程序运行期间经常被调用,因此它需要尽可能快 然而,我怀疑连续五次MPI_广播对程序性能有害。。。我使用非阻塞BCAST(MPI_IBCAST)进行了一些测试,我看到了性能的改进。 不幸的是,我无法使用它,因为它在某些MPI实现中似乎不可用(至少在我正在使用的集群上安装的版本…) 你对如何改善这种情况有什么想法吗

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

然而,我怀疑连续五次MPI_广播对程序性能有害。。。我使用非阻塞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的值

所有的过程都是计算的一部分,还是更多过程中的五个?也许可以选择
MPI\u Allgather
。由于
a、b、c
未被隐藏,因此理解您的示例应该表示什么有点困难。这不是您声称的性能问题。通常通过让每个列组在其需要的数组的不同部分上工作来解决此类问题,并不是像您的例子那样,让每个数组由单独的列组处理,然后进行全局数据同步。但是MPI教程中充满了从大数组到其他列组中的小部分的BCAST。我从来都不需要它。