我知道这段代码是正确的
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?
答案 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集体的重要事项 - 所有流程(在沟通者中)必须以相同的顺序调用它们。