分散在 mpi [一个非常简单的代码]
scatter in mpi [a very simple code]
这里是mpi scatter的代码:
#include <stdio.h>
#include <mpi.h>
int a[10]={1,2,3,4,5,6,7,8,9,10};
int b[1];
int main(int argc, char *argv[]) {
int rank;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Barrier(MPI_COMM_WORLD);
if(rank ==0){
MPI_Scatter(a,1,MPI_INT,b,1,MPI_INT,0,MPI_COMM_WORLD);
}
MPI_Barrier(MPI_COMM_WORLD);
printf("\n%d from rank=%d\n",b[0],rank);
MPI_Finalize();
return 0;
}
我想要输出如下:
1 from rank 0
2 from rank 1
3 from rank 2
...
但是我得到了
1 from rank 0
0 from rank 1
0 from rank 2
0 from rank 3
0 from rank 4
...
MPI_Scatter()
是集体行动,必须由所有通讯员队伍调用。
去掉 if (rank == 0)
你会没事的。
请注意,在您的示例中,a
发送缓冲区足够小,不会导致任何挂起。
这里是mpi scatter的代码:
#include <stdio.h>
#include <mpi.h>
int a[10]={1,2,3,4,5,6,7,8,9,10};
int b[1];
int main(int argc, char *argv[]) {
int rank;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Barrier(MPI_COMM_WORLD);
if(rank ==0){
MPI_Scatter(a,1,MPI_INT,b,1,MPI_INT,0,MPI_COMM_WORLD);
}
MPI_Barrier(MPI_COMM_WORLD);
printf("\n%d from rank=%d\n",b[0],rank);
MPI_Finalize();
return 0;
}
我想要输出如下:
1 from rank 0
2 from rank 1
3 from rank 2
...
但是我得到了
1 from rank 0
0 from rank 1
0 from rank 2
0 from rank 3
0 from rank 4
...
MPI_Scatter()
是集体行动,必须由所有通讯员队伍调用。
去掉 if (rank == 0)
你会没事的。
请注意,在您的示例中,a
发送缓冲区足够小,不会导致任何挂起。