我对并行处理很陌生。我有一个以顺序方式计算和存储2D数组元素的例子。我想使用MPI将其转换为并行程序。
以下是顺序程序的代码。
#include <stdio.h>
int x,y,xMax=10,yMax=10;
int main ()
{
int arr[yMax][xMax];
for(y =0; y<yMax;x++)
{
for (x=0;x<xMax;x++)
{
arr[y][x]=x+y;
printf("%d",arr[y][x]);
}
printf("\n");
}
}
我尝试通过并行化外部for循环将其转换为等效的MPI程序,如下所示: 在这里,我希望每个进程计算每个数组行的值,并将输出数组发送到根进程,最后将收集所有数组并将它们组合成单个2D数组。
#include <stdio.h>
#include <mpi.h>
int x,y,xMax=10,yMax=10,size,rank;
int main()
{
int arr[xMax];
int arrall[yMax][xMax];
MPI_Init(NULL,NULL);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
for(y =0+rank; y<yMax;y=y+size)
{
for (x=0;y<xMax;x++)
{
arr[y][x]=x+y;
}
MPI_Send(arr,xMax,MPI_INT,0,0,MPI_COMM_WORLD);
}
if(rank==0)
{
MPI_Gather(arr,xMax,MPI_INT,&arrall,xMax*yMax,MPI_INT,0,MPI_COMM_WORLD);
}
MPI_Finalize();
}
但是当我编译程序并等待一段时间但它仍然没有给出任何结果。它没有显示错误。 我正在尝试相当一段时间并搜索任何解决方案但无法找到。任何帮助都感激不尽。感谢
答案 0 :(得分:0)
你实际上认为太复杂了。 MPI中的集体操作负责发送和接收部分。标记写入时,MPI_Send
之类的点对点消息只会与点对点消息(例如MPI_Recv
)匹配,而集合仅与同一集合匹配。
对于所有流程,只需调用MPI_Gather
即可完成整个通信:
MPI_Gather(arr,xMax,MPI_INT,arrall,xMax,MPI_INT,0,MPI_COMM_WORLD);
请注意,recvcount
为xMax
,因为它指定了每次接收中的元素数量。
更多评论:
size == yMax
编辑:每个等级多行的一种特定方式:
int rows_per_rank = yMax / size;
assert(rows_per_rank * size == yMax);
MPI_Gather(arr,xMax * rows_per_rank,MPI_INT,arrall,xMax * rows_per_rank,MPI_INT,0,MPI_COMM_WORLD);