c - MPI_Gather 发送和接收数组错误
问题描述
#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 所指出的那样干净)。
推荐阅读
- maven - TestNG - 并行执行测试套件
- java - 使用 Spring Boot 在 JPQL 查询的 Where 子句中定义整数值
- concurrency - 不可变对象的真正好处是什么
- asp.net - ASP.NET MVC 使用 nginx 进行负载平衡。更改后端目标后身份验证丢失
- java - 在 Spring Data Redis 中,如何将多个键传递给 leftpop() (rightpop()) 方法超时?
- java - 如何使返回类型与打印函数具有相同的输出?
- c# - 搜索列表列表
- android - Android Studio:将数据从 android 传递到 php
- angular - 安全的 WebSocket 连接在 Mac OS 中的 FireFox 和 Chrome 中不起作用?
- architecture - Tanenbaum 现代操作系统的页表大小练习