MPI_Gatherv 不包括来自根进程的数据

MPI_Gatherv not including data from root process

我 运行 在尝试使用 MPI_Gatherv 时遇到了奇怪的行为,我一定是误解了有关该功能的一些基本知识。为了演示,我已将我的代码简化为一个玩具问题,希望它在没有太多上下文的情况下也很容易理解。

  int * gatherv_counts = (int *)malloc(2*sizeof(int)); 
  int * gatherv_displacements = (int *)malloc(2*sizeof(int)); 
  double * receive_buffer = (double *)malloc(10*sizeof(double)); 

  for(int i = 0; i < 2; i++)
  {
    gatherv_counts[i] = 5;
    gatherv_displacements[i] = 0;
  }

  double * data = (double *)malloc(5*sizeof(double));
  for(int i = 0; i < 5; i++)
  {
      data[i] = (double)(mpirank + 2);
  }

  int mpiret = MPI_Gatherv( data, 5, MPI_DOUBLE, receive_buffer, gatherv_counts, gatherv_displacements, MPI_DOUBLE, 0, mpicomm); 

  if (mpirank == 0) {

    FILE *file = fopen("output.txt", "a");
    
    for (int i = 0; i < 10; i++) {
      fprintf (file, "%16.15e \n", receive_buffer[i]);
    }        
    
    fflush(file);
    fclose(file);
  }

我 运行 这有 2 个 MPI 进程。来自每个进程的数据只有 5 个双倍(总组合大小为 10),值设置为 rank+2。计数只是硬编码为 5,位移均为 0。这与我想象的 MPI_Gatherv 的用法一样简单,我希望 receive_buffer 为 [2,2,2 ,2,2,3,3,3,3,3]完成后。

相反,receive_buffer 是 [3,3,3,3,3, 0,0,4.940656458412465e-324, 1.182342568274937e-316, 1.146400746224656e+248]。它似乎完全跳过了第 0 位(MPI_Gatherv 的根)的数据,取了第 1 位的数据,而剩下的 space 填满了垃圾。有人可以解释这里出了什么问题吗?

此外,郑重声明,我看到过许多标题相似的问题,但这些问题似乎不是同一个问题:

所有位移都为零。做:

displacements[1] = displacements[0] + counts[0]

对于更高的排名计数类似。