MPI_Bcast接收者和发送者之间的同步

时间:2015-10-12 13:05:14

标签: matrix process parallel-processing mpi communication

想象一下,n个进程每个都包含2行和8个元素的矩阵(线性存储,而不是2D)。我希望每个进程将其行传递给具有较低级别的所有进程。例如,具有等级2的过程将其行传递给具有等级1和0的过程;排名为0的进程不会将其行传递给任何进程。

我在决定如何解决这个问题时遇到了问题。使用MPI_Bcast是一种可能的解决方案,但我似乎无法使操作按预期工作。您可以在下面看到我正在执行的代码示例。

// npes is the number of processes obtained from MPI_INIT
// The value for i below is used to specify the number of 
// rows that will be received
for (i = (npes - rank - 1) * rowsPerProcess; i > 0; i--) {
  // Receive
  MPI_Bcast(temp, columns, MPI_DOUBLE, i/rowsPerProcess, MPI_COMM_WORLD);
  printf("I'm %d and I received from %d\n", rank, i/rowsPerProcess);
}

if (rank != 0) { // rank 0 does not send data
  for (row = rowsPerProcess - 1; row >= 0; row--) {
    for (j = 0; j < columns; j++) {
      //matrix_chunk is the per process matrix of 2 rows
      temp[j] = matrix_chunk[row*columns + j];
    }
    // Send
    printf("I'm sender %d\n", rank);
    MPI_Bcast(temp, columns, MPI_DOUBLE, rank, MPI_COMM_WORLD);
  }
}

我收到的输出如下:

I'm 1 and I received from 1
I'm sender 2
I'm sender 2
I'm 0 and I received from 2
I'm 0 and I received from 1
I'm 0 and I received from 1
I'm 0 and I received from 0
I'm 1 and I received from 0
I'm sender 1
I'm sender 1

似乎第一次接收MPI_Bcast呼叫正在作为发送方操作执行。我还打印了收到的临时矩阵的内容,但它们并不是我所期望的那样。

除了试图纠正这个混乱之外,我想了解一下我如何能够解决这个特定的沟通问题。我觉得我是从错误的方向接近这个。如果您有任何建议,请与我们联系!

1 个答案:

答案 0 :(得分:0)

我按照High Performance Mark的建议实现了匹配的mpi_send和mpi_recv。当我通过这种方法想到它时,问题立即变得有意义。