MPI_Bcast里面的if语句

时间:2017-06-10 12:30:03

标签: c parallel-processing mpi

我知道这段代码是正确的

DECLARE @Original_String VARCHAR(50);
declare @searchstring varchar(10);
DECLARE @RESULT TABLE (Characters VARCHAR(5),COUNTS INT)
SET @Original_String='aaabbcdFFFFGGH'

DECLARE @i int=65
WHILE @i < 91
BEGIN

set @searchstring = CHAR(@i)

IF len(@original_string) - len(replace(@original_string, @searchstring, ''))<>0
BEGIN
INSERT INTO @RESULT VALUES(@searchstring,len(@original_string) - len(replace(@original_string, @searchstring, '')))
 END
SET @i=@i+1;
END

SELECT * FROM @RESULT

但是这段代码呢。我问了一个人,我们进行了辩论,他告诉我这段代码是完全错误的。

#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(); 
}

我知道它没有效率,但我无法理解为什么这是错误的。 我知道每个进程都会获取以下程序的副本并对其进行处理,因此所有进程都将使用MPI_Bcast,就像它在if语句之外一样,所以任何人都可以向我解释当我使用它时会发生什么if语句中的MPI_Bcast?

1 个答案:

答案 0 :(得分: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集体的重要事项 - 所有流程(在沟通者中)必须以相同的顺序调用它们。