在if语句中使用MPI_Bcast

3
我知道这份代码是正确的。
#include <stdio.h>
#include "mpi.h"

int main(int argc, char * argv[]){
    int my_rank, p, n;

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &p);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

    if(my_rank == 0){
        scanf("%d", &n);
    }

    MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

    MPI_Finalize(); 
}

但是这段代码怎么办呢?我向某人询问并且我们进行了一番辩论,他告诉我这段代码完全是错的。
#include <stdio.h>
#include "mpi.h"

int main(int argc, char * argv[]){
    int my_rank, p, n;

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &p);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

    if(my_rank == 0){
        scanf("%d", &n);
        MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
    }
    else {
        MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
    }

    MPI_Finalize(); 
}

我知道这不是高效的,但我不明白为什么它是错误的。 我理解每个进程都会复制以下程序并对其进行操作,因此所有进程将像MPI_Bcast在if语句外一样使用它,所以有人能解释一下当我在if语句中使用MPI_Bcast时到底发生了什么吗?


看起来不像是完全错误的代码 :) 只是有点不同 :) - Oo.oO
@mko 从技术上讲,那个人是我的教授,所以我问他是否有我不知道的东西。 - Amr Saeed
嗯...老实说,很难说这里到底有什么“完全错误”的地方:( 但是,如果你已经知道了,请告诉我们。所有的过程都在调用MPI_Bcast。听起来有些棘手;) - Oo.oO
1个回答

3

第一段和第二段代码在语义上是等效的。两者都是正确的MPI程序。你可以通过编译两者来轻松证明这一点 - 在优化的情况下,编译器会创建完全相同的汇编代码。

$ mpicc -S first.c -O3
$ mpicc -S second.c -O3
$ diff first.s second.s
1c1
<   .file   "first.c"
---
>   .file   "second.c"

话虽如此,第一个代码是更好的版本。它具有更简单的控制流程,并且更容易展示所有排名都进入障碍物的正确性。对于MPI集合,确保所有进程(在通信器中)按相同顺序调用它们是非常重要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接