MPI_Programs 中有什么方法可以命令流程的执行吗?

Is there any way in MPI_Programs to order the execution of processes?

假设我有 2 个进程,P1 和 P2,并且 P1 和 P2 都在打印一个包含 1000 个数据点的数组。正如我们所知,我们无法保证输出顺序,可能是 P1 先打印数据然后 P2 打印数据,反之亦然,也可能是两个输出混合在一起。现在说我想先输出 P1 的值,然后再输出 P2。有什么方法可以保证吗?

我附上了一个最小的可复制示例,其中输出与此处混合

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"



int main( int argc, char *argv[])
{

    MPI_Init(&argc, &argv);
    
     int myrank, size; //size will take care of number of processes 
     
      MPI_Comm_rank(MPI_COMM_WORLD, &myrank) ;
      MPI_Comm_size(MPI_COMM_WORLD, &size);
     
     if(myrank==0)
     {
     
        
     
        int a[1000];
        
        
        for(int i=0;i<1000;i++)
        {
            a[i]=i+1;
        }
        
        for(int i=0;i<1000;i++)
        {
            printf(" %d",a[i]);
        }
        
        
     }
     
     if(myrank==1)
     {
     
        int a[1000];
        
        
        for(int i=0;i<1000;i++)
        {
            a[i]=i+1;
        }
        
        for(int i=0;i<1000;i++)
        {
            printf(" %d",a[i]);
        }
        
        
     }
         
    
        MPI_Finalize();
        return 0;   

}

我能想到的顺序输出数据的唯一方法是将数据从 P1 发送到 P0,然后从 P0 打印所有数据。但随后我们将承担从一个进程向另一个进程发送数据的额外计算成本。

Now say I want to output the values of P1 first followed by P2. Is there any way by which I can guarantee that?

这不是 MPI 的用途,实际上是一般 IMO 中的并行性。在进程之间将输出打印到控制台的协调将大大降低并行版本的性能,这违背了并行的目的之一,即减少整体执行时间。

大多数时候最好让一个进程负责将输出打印到控制台(通常是 master 进程 处理 rank = 0).

引用@Gilles Gouaillardet:

The only safe option is to send all the data to a given rank, and then print the data from that rank.

您可以尝试使用 MPI_Barrier to coordinate the processes in a way that would print the output has you want, however (citing @Hristo Iliev):

Using barriers like that only works for local launches when (and if) the processes share the same controlling terminal. Otherwise, it is entirely to the discretion of the I/O redirection mechanism of the MPI implementation.

如果是为了调试目的,您可以使用一个好的 MPI 感知调试器,它允许查看每个进程的数据内容。或者,您可以限制在 per 运行 时在一个进程中打印输出,以便您可以检查是否所有进程都具有它们应该具有的数据。

您还有一些额外的选择:

  • 传递一个令牌。进程可以阻塞等待消息,打印任何内容,然后发送到下一个级别
  • 让其他事情处理订购。每个进程都将其排名作为输出前缀,然后您可以按排名对输出进行排序。
  • 假设这是一个文件。每个级别都可以计算它应该写入的位置,然后每个人都可以并行地在正确的位置执行对文件的权限(这就是 mpi-io 应用程序将要做的)