首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何利用MPI_Gather

如何利用MPI_Gather
EN

Stack Overflow用户
提问于 2016-06-17 18:03:35
回答 1查看 321关注 0票数 1

我有两个MPI进程。每个进程都有一个大小相同的数组。我想把两个数组合并成一个双倍大小的数组。我应该使用哪个mpi接口?

例如,我有两个数组:

我想让他们进入0级:

我试过MPI_Gather

代码语言:javascript
复制
MPI_Gather(
    arr, // void* send_data,
    4, // int send_count,
    MPI_INT, // MPI_Datatype send_datatype,
    arr_merged, // void* recv_data,
    1, // int recv_count,
    MPI_INT, // MPI_Datatype recv_datatype,
    0, // int root,
    MPI_COMM_WORLD); // MPI_Comm communicator

但我错了

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-20 16:12:40

以上代码在计数方面是不正确的。除非您正在处理派生类型,否则sendcount和recvcount应该是相同的(在本例中是4)。然而,这将导致顺序:0 2 4 6 1 3 5 7,即这两条消息一个接一个地收到。

通过定义向量类型,您可以接收到跨距模式。但是,为了接收到正确的位置,您需要使用MPI_Gatherv为每个发送方指定不同的位移--您还需要调整向量类型的大小,因为默认范围是没有用的。

附加的代码似乎工作正常,其中第一行输出使用通常的集合,而第二行使用接收端的采集和向量数据类型。不幸的是,找不到更简单的方法.

代码语言:javascript
复制
user$ mpicc -o mpigather mpigather.c
user$ mpiexec -n 2 ./mpigather  
0 2 4 6 1 3 5 7 
0 1 2 3 4 5 6 7 
user$ mpiexec -n 3 ./mpigather
0 3 6 9 1 4 7 10 2 5 8 11 
0 1 2 3 4 5 6 7 8 9 10 11 

下面是代码:

代码语言:javascript
复制
#include <stdio.h>
#include <mpi.h>

#define NBUFF 4

void main(void)
{
  int i;
  MPI_Comm comm = MPI_COMM_WORLD;
  MPI_Datatype vector, resizevector;
  int rank, size;

  MPI_Init(NULL, NULL);
  MPI_Comm_rank(comm, &rank);
  MPI_Comm_size(comm, &size);

  int sendbuff[NBUFF];
  int recvbuff[size*NBUFF];

  for (i=0; i < NBUFF; i++)
    {
      sendbuff[i] = rank+i*size;
    }

  for (i=0; i < NBUFF*size; i++)
    {
      recvbuff[i] = -1;
    }

  MPI_Gather(sendbuff, NBUFF, MPI_INT, recvbuff, NBUFF, MPI_INT, 0, comm);

  if (rank == 0)
    {
      for(i=0; i < NBUFF*size; i++)
      {
        printf("%d ", recvbuff[i]);
      }
      printf("\n");
    }

  MPI_Type_vector(NBUFF, 1, size, MPI_INT, &vector);
  MPI_Type_create_resized(vector, 0, sizeof(int), &resizevector);
  MPI_Type_commit(&resizevector);

  int recvcounts[size];
  int displs[size];

  for (i=0; i < size; i++)
    {
      recvcounts[i] = 1;
      displs[i] = i;
    }

  MPI_Gatherv(sendbuff, NBUFF, MPI_INT, recvbuff, recvcounts, displs, resizevector, 0, comm);

  if (rank == 0)
    {
      for(i=0; i < NBUFF*size; i++)
      {
        printf("%d ", recvbuff[i]);
      }
      printf("\n");
    }

  MPI_Finalize();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37887704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档