program main
implicit none
include "mpif.h"
integer nproc,rank,ierr,a(4),ll,i,j
call MPI_INIT(ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD,nproc,ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD,rank,ierr)
ll=0
a(:)=0
do i=1,4
do j=1,4
a(i)=a(i)+1
a(j)=a(j)+1
ll=ll+1
enddo
enddo
call MPI_FINALIZE(ierr)
end program main
这是我的代码。我想让这两个循环并行,即“嵌套并行”。最后,a(:)一定是a(:)=8,ll一定是ll=16。我如何通过仅使用 MPI 仅使用两个线程(0 和 1)来做到这一点?
(1,2) 0---------------------1 (3,4) -----------> i loop
| |
| |
0-------------1 0--------------1
| | | |
| | | |
(1,2) (3,4) (1,2) (3,4) ---------> j loop
首先:MPI不使用线程,它是基于进程的。由于进程具有单独的数据空间,这意味着您不能让 MPI 进程对某些共享对象进行操作。
这让我想到了要点:您需要在进程中拆分数据对象。这里你有两个选择:
您关于嵌套并行性的问题没有多大意义。您可能正在考虑线程创建线程,但这不是 MPI 的工作方式:您创建一堆进程,然后在程序的生命周期中拥有这些进程。是的,你可以用子通信器做一些事情,但我猜这超出了你目前的理解水平。以后想到的架子。