仅使用 MPI 的嵌套并行性

问题描述 投票:0回答:1
  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
nested fortran mpi
1个回答
0
投票

首先:MPI不使用线程,它是基于进程的。由于进程具有单独的数据空间,这意味着您不能让 MPI 进程对某些共享对象进行操作。

这让我想到了要点:您需要在进程中拆分数据对象。这里你有两个选择:

  1. 您可以在进程 0 上创建数组,分发它,并行操作它,然后再次将整个过程组合在一起。这是非常低效的。
  2. 您可以让每个进程创建对象的一部分,对其进行操作,然后就完成了。

您关于嵌套并行性的问题没有多大意义。您可能正在考虑线程创建线程,但这不是 MPI 的工作方式:您创建一堆进程,然后在程序的生命周期中拥有这些进程。是的,你可以用子通信器做一些事情,但我猜这超出了你目前的理解水平。以后想到的架子。

© www.soinside.com 2019 - 2024. All rights reserved.