我正在尝试改进我用于数值模拟的代码之一。其中一个计算步骤需要计算几个大型数组,其计算复杂且成本高。现在做的是每个数组由特定的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的值。