使用并行处理MPI

时间:2017-01-27 07:31:24

标签: c arrays parallel-processing mpi

我对并行处理很陌生。我有一个以顺序方式计算和存储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();
}

但是当我编译程序并等待一段时间但它仍然没有给出任何结果。它没有显示错误。 我正在尝试相当一段时间并搜索任何解决方案但无法找到。任何帮助都感激不尽。感谢

1 个答案:

答案 0 :(得分:0)

你实际上认为太复杂了。 MPI中的集体操作负责发送和接收部分。标记写入时,MPI_Send之类的点对点消息只会与点对点消息(例如MPI_Recv)匹配,而集合仅与同一集合匹配。

对于所有流程,只需调用MPI_Gather即可完成整个通信:

MPI_Gather(arr,xMax,MPI_INT,arrall,xMax,MPI_INT,0,MPI_COMM_WORLD);

请注意,recvcountxMax,因为它指定了每次接收中的元素数量。

更多评论:

  • 您必须确保size == yMax
  • 这只能起作用,因为2D数组在内存中连续排列。这不适用于指针 - &#34; 2D&#34; -arrays。
  • 在实际的MPI程序中,您希望避免将整个工作数据收集到一个等级上,因为它提供了可伸缩性的限制。相反,你应该做所有分发的事情。

编辑:每个等级多行的一种特定方式:

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);