MPI_Gather 的问题无法将 8 个 32 个元素的数组收集到一个 256 个元素的大数组中

Posted

技术标签:

【中文标题】MPI_Gather 的问题无法将 8 个 32 个元素的数组收集到一个 256 个元素的大数组中【英文标题】:Problem with MPI_Gather Couldnt gather 8 arrays of 32 element into a big array of 256 elements 【发布时间】:2022-01-17 20:17:53 【问题描述】:

我是 MPI 新手,我有一个 256 整数数组,我想将每个数字除以 16,我建议在每个处理器上分散 32 个元素,但我无法收集它们,因为每个返回值都包含 32 数组

int globalhistogram[256];
float globalProb[256];
float* localprob = new float[32];
int localpixel[32];

MPI_Scatter(&globalhistogram, 32, MPI_INT, localpixel, 32, MPI_INT, 0, MPI_COMM_WORLD);
for (int i = 0; i < 32; i++)

  localprob[i] = (float)localpixel[i] / 16;


MPI_Gather(localprob, 32, MPI_FLOAT, &globalprob, 32, MPI_FLOAT, 0, MPI_COMM_WORLD);

【问题讨论】:

在分散调用中,将&amp;globalhistogram 更改为histogram,在收集调用中,将&amp;globalprob 更改为globalprob。您的间接级别太高了:globalprob 已经是缓冲区地址。 你正在运行 8 个 MPI 任务,对吧? 是的 8 个任务,我想将每个任务的输出收集到一个数组中,但每个任务都返回一个包含 32 个元素的数组 【参考方案1】:

我不明白这个问题 - 在我更正我认为是错字 float globalProb[256] -> float globalprob[256] 后,代码似乎可以正常运行。

我同意@victor-eijkhout 关于&amp;globalprob 问题的看法,但似乎没有什么不同。

如果我编译并运行附加的代码,我会得到预期的答案:

dsh@laptop$ mpicxx -o play play.cpp 
dsh@laptop$ mpirun -n 8  ./play
rank 0: globalprob[0] = 0.000000
...
rank 0: globalprob[31] = 31.000000
rank 0: globalprob[32] = 64.000000
...
rank 0: globalprob[255] = 2040.000000

这是完整的代码:

#include <stdio.h>
#include <mpi.h>

int main(void)

  int rank, size, i;

  MPI_Init(NULL, NULL);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);

  int globalhistogram[256];
  float globalprob[256];
  float* localprob = new float[32];
  int localpixel[32];

  for (i=0; i < 256; i++)
    
      globalhistogram[i] = i;
    

  MPI_Scatter(&globalhistogram, 32, MPI_INT, localpixel, 32, MPI_INT, 0, MPI_COMM_WORLD);

  for (int i = 0; i < 32; i++)
    
      localprob[i] = (float)localpixel[i] *(rank+1);
    

  MPI_Gather(localprob, 32, MPI_FLOAT, &globalprob, 32, MPI_FLOAT, 0, MPI_COMM_WORLD);

  if (rank == 0)
    
      for (i=0; i < 256; i++)
        
          printf("rank %d: globalprob[%d] = %f\n", rank, i, globalprob[i]);
        
    
  MPI_Finalize();

【讨论】:

以上是关于MPI_Gather 的问题无法将 8 个 32 个元素的数组收集到一个 256 个元素的大数组中的主要内容,如果未能解决你的问题,请参考以下文章

使用 MPI_Gather 在 Fortran 中发送二维数组

在 C 中使用 MPI_Type_Vector 和 MPI_Gather

如何从 C 中使用 MPI_Scatter 和 MPI_Gather?

为什么一个指针在32位系统中占4个字节,在64位系统中占8个字节?

无法将绝对div对齐在中心[重复]

Android 8.1 自定义热点的时候设置了热点maxLength="32",但是在希伯来语等状态下还是发现在没到32个字符之前就无法把热点设置成功了