首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenMPI MPI_Barrier问题

OpenMPI MPI_Barrier问题
EN

Stack Overflow用户
提问于 2011-03-03 14:30:06
回答 4查看 9K关注 0票数 10

我在使用OpenMPI实现MPI_Barrier时遇到了一些同步问题:

代码语言:javascript
复制
int rank;
int nprocs;

int rc = MPI_Init(&argc, &argv);

if(rc != MPI_SUCCESS) {
    fprintf(stderr, "Unable to set up MPI");
    MPI_Abort(MPI_COMM_WORLD, rc);
}

MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);


printf("P%d\n", rank);
fflush(stdout);

MPI_Barrier(MPI_COMM_WORLD);

printf("P%d again\n", rank);

MPI_Finalize();

用于mpirun -n 2 ./a.out

输出应该是: P0 P1 ..。

有时输出是: P0 P0 P1 P1再一次

到底怎么回事?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-03 16:33:33

打印出的线条出现在终端上的顺序不一定是打印事物的顺序。为此您使用的是共享资源(stdout),因此始终存在排序问题。( fflush在这里没有帮助,stdout无论如何都是行缓冲的。)

您可以尝试在输出前加上时间戳,并将所有这些保存到不同的文件中,每个MPI进程一个。

然后,要检查日志,可以将两个文件合并在一起,并根据时间戳进行排序。

那么你的问题就会消失。

票数 16
EN

Stack Overflow用户

发布于 2011-03-03 17:38:34

MPI_Barrier()没有什么问题。

作为Jens mentioned,您没有看到预期的输出的原因是因为每个进程都缓冲了stdout。无法保证来自多个进程的打印将按顺序显示在调用进程上。(如果每个进程的stdout被转移到主进程进行实时打印,这将导致大量不必要的通信!)

如果您想让自己相信这个障碍有效,您可以尝试将其写入一个文件。将多个进程写入单个文件可能会导致额外的复杂性,因此您可以让每个进程写入一个文件,然后在设置障碍后,交换它们写入的文件。例如:

代码语言:javascript
复制
    Proc-0           Proc-1
      |                 |
 f0.write(..)     f1.write(...) 
      |                 |
      x  ~~ barrier ~~  x
      |                 |
 f1.write(..)     f0.write(...) 
      |                 |
     END               END

抽样实施情况:

代码语言:javascript
复制
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    char filename[20];
    int rank, size;
    FILE *fp;

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    if (rank < 2) { /* proc 0 and 1 only */ 
        sprintf(filename, "file_%d.out", rank);
        fp = fopen(filename, "w");
        fprintf(fp, "P%d: before Barrier\n", rank);
        fclose(fp);
    }

    MPI_Barrier(MPI_COMM_WORLD);

    if (rank < 2) { /* proc 0 and 1 only */ 
        sprintf(filename, "file_%d.out", (rank==0)?1:0 );
        fp = fopen(filename, "a");
        fprintf(fp, "P%d: after Barrier\n", rank);
        fclose(fp);
    }

    MPI_Finalize();
    return 0;

}

运行代码后,您应该得到以下结果:

代码语言:javascript
复制
[me@home]$ cat file_0.out
P0: before Barrier
P1: after Barrier

[me@home]$ cat file_1.out
P1: before Barrier
P0: after Barrier

对于所有文件,"after Barrier“语句将始终出现在后面。

票数 12
EN

Stack Overflow用户

发布于 2011-03-03 22:42:20

MPI程序中没有保证输出顺序。

这与MPI_Barrier完全无关。

另外,我也不会花太多的时间来担心MPI程序的输出排序。

如果您真的想这样做,最优雅的方法是让进程将它们的消息发送到一个级别,例如,级别0,并让级别0按照接收到的输出或按等级排序的顺序打印输出。

同样,不要花费太多的时间来尝试命令MPI程序的输出。这是不实际的,也没有什么用处。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5182045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档