如何在没有其他进程重叠的情况下从进程打印某些内容?

How to print something from processes without other processes overlapping it?

我写了一个 MPI 代码,我 运行 使用 16 个进程,我正在打印 4x4 矩阵作为每个进程的输出:

printf("\n This is the output of %d\n",myrank);
for(int i=0;i<count;i++)
{
    for(int j=0;j<count;j++)
    {
        printf("%f ",m[i][j]);
    }
    printf("\n");
}

但问题是每个进程的输出都与其他进程混淆了。像这样--

 This is the output of 3
0.750000 0.750000 0.750000 0.500000 
 This is the output of 9
1.000000 1.000000 1.000000 1.000000 
1.000000 1.000000 1.000000 
1.000000 1.000000 1.000000 0.750000 
1.000000 1.000000 1.000000 0.750000 1.000000 
1.000000 1.000000 1.000000 1.000000 
1.000000 1.000000 1.000000 1.000000 
1.000000 1.000000 1.000000 0.750000 

如何防止这种行为?

I have written an MPI code which I am running using 16 processes and I am printing 4x4 matrix as output from each of those process.

这不是 MPI 的用途,实际上是一般 IMO 中的并行性。进程之间将输出打印到控制台的协调将大大降低并行版本的性能。

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

尽管如此,您可以使用 MPI_Barrier 尝试以下操作,例如:

int rank;
MPI_Comm_rank (MPI_COMM_WORLD, &rank);  /* get current process id */
...
MPI_Barrier(MPI_COMM_WORLD);
if(rank == /** the rank of the process that will print the output **/)
{
   // printing the data to the output
}
MPI_Barrier(MPI_COMM_WORLD);

针对您的情况:

MPI_Barrier(MPI_COMM_WORLD);
printf("\n This is the output of %d\n",myrank);
MPI_Barrier(MPI_COMM_WORLD);
for(int i=0;i<count;i++)
{
    for(int j=0;j<count;j++)
    {
        printf("%f ",m[i][j]);
    }
    printf("\n");
}

这至少可以避免输出 "This is the output of 3" 与矩阵的输出混合。

但是请记住(引自 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_SendMPI_Recv。可能类似于进程等待 MPI_Recv 以等待另一个进程发送一条消息,表明该进程刚刚完成打印它的矩阵部分。例如,有 4 个进程:

进程1等待进程0的消息,进程2等待进程1的消息等等。进程 0 打印矩阵的一部分并将消息发送到进程 1,后者以相同的方式进行。但是你最好再次发送整个矩阵来处理 0 并让该过程将矩阵打印到控制台。