目录
上一节我们介绍了MPI非阻塞通信的接口、特征和使用方法,本节将采用非阻塞通信接口来实现Jacobi迭代。
传送门→MPI非阻塞通信接口:
并行程序设计基础——非阻塞通信-CSDN博客https://blog.csdn.net/L_peanut/article/details/141217286?spm=1001.2014.3001.5501 传送门→Jacobi迭代:
并行程序设计基础——并行模式之对等模式-CSDN博客https://blog.csdn.net/L_peanut/article/details/141057062?spm=1001.2014.3001.5502 我们通过使用不同的方式,提高了Jacobi迭代的性能,这里我们将通过非阻塞通信再次提升Jacobi迭代的性能,实现Jacobi迭代中通信与计算的重叠。
一、非阻塞通信实现Jacobi迭代
为实现计算与通信的最大重叠,一个通信的原则就是“尽早开始通信,尽晚完成通信”,在开始通信和完成通信之间进行计算,这样通信启动的越早,结束的越晚,就有可能有更多的计算任务可以和通信重叠,同时也可以使得通信在计算任务执行期间完成,而不需要专门的等待时间。
我们修改Jacobi迭代过程如下:
程序仍按照列分成四块进行计算:
program main
implicit none
include 'mpif.h'
integer totalsize, mysize, steps
parameter (totalsize = 16)
parameter (mysize = totalsize/4, steps = 10)
integer n, myid, numprocs, i, j, rc, ierr
integer begin_col, end_col
integer left, right, tag1, tag2
integer status(MPI_STATUS_SIZE)
integer req(4)
real a(totalsize, mysize+2), b(totalsize, mysize+2)
call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr)
print *, "Process ", myid, " of ", numprocs, " is alive!"
!数组赋值
do j = 1, mysize+2
do i = 1, totalsize
a(i,j) = 0.0
enddo
enddo
do i = 1, totalsize
a(i, 1) = 8.0
a(i, mysize+2) = 8.0
enddo
if(myid .eq. 0) then
do i = 1, totalsize
a(i, 2) = 8.0
enddo
endif
if(myid .eq. 3) then
do i = 1, totalsize
a(i, mysize+1) = 8.0
enddo
endif
do i = 1, mysize+2
a(1, i) = 8.0
a(totalsize, i) = 8.0
enddo
tag1 = 3
tag2 = 4
!计算当前进程的左右相邻进程
if(myid .gt. 0) then
left = myid - 1
else
left = MPI_PROC_NULL
endi