#include<mpi.h>
#include<stdio.h>
int main(int argc,char * argv[])
{
int rank,size,m;
int arr[1000];
int b[100];
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
if(rank == 0)
{
scanf("%d",&m);
for(int i=0;i<size*m;i++)
{
scanf("%d",&arr[i]);
}
}
MPI_Barrier(MPI_COMM_WORLD);
MPI_Scatter(arr,m,MPI_INT,b,m,MPI_INT,0,MPI_COMM_WORLD);
printf("in process %d \n",rank);
for(int i=0;i<m;i++)
{
printf("%d ",b[i]);
}
printf("\n");
MPI_Finalize();
return 0;
}
输入值
mpiexec -n 4 ./three
实际产量
in process 2
in process 1
in process 3
2
1 2 3 4 5 6 7 8
in process 0
1 2
预期产量
2
1 2 3 4 5 6 7 8
in process 0
1 2
in process 1
3 4
in process 2
5 6
in process 3
7 8
最佳答案
您尚未广播m的值,因此只有等级0具有正确的值-看起来它在其他等级上默认为m = 0,因此缺少输出。
不需要障碍-MPI集合会自动执行所有必要的同步。
如果您将无障碍电话替换为:
MPI_Bcast(&m, 1, MPI_INT, 0, MPI_COMM_WORLD);
那么您的代码将按预期工作(取决于上面的Gilles指出的输出结果不尽如人意)。
关于c - MPI_Gather发送和接收阵列错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54269514/