gpt4 book ai didi

c - MPI_Bcast 在 If 语句中

转载 作者:行者123 更新时间:2023-12-01 13:34:31 25 4
gpt4 key购买 nike

我知道这段代码是正确的

#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 语句之外一样,所以任何人都可以向我解释一下我使用时到底发生了什么MPI_Bcast 在 if 语句中?

最佳答案

第一个和第二个代码在语义上是等价的。两者都是正确的 MPI 程序。您可以轻松地证明,通过编译两者 - 优化编译器创建完全相同的汇编代码..

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

也就是说,第一个代码是更好的版本。它有一个更简单的控制流程,并且更容易证明它在某种意义上是正确的,所有等级都进入了障碍。这是确保 MPI 集体的重要事情 - 所有进程(在通信器中)必须以相同的顺序调用它们。

关于c - MPI_Bcast 在 If 语句中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44473316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com