【问题标题】:MPI_Bcast synchronization between receiver and sender接收方和发送方之间的 MPI_Bcast 同步
【发布时间】:2016-01-09 23:28:23
【问题描述】:

假设有 n 个进程,每个进程都包含一个 2 行和 8 个元素的矩阵(线性存储,而不是二维存储)。我希望每个进程将其行传达给所有级别较低的进程。例如,等级为 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 调用正在作为发送方操作执行。我还打印了接收到的临时矩阵的内容,它们不是我所期望的。

除了试图纠正这种混乱之外,我还想了解如何解决这个特定的通信问题。我觉得我从错误的方向接近这个。如果您有任何建议,请告诉我!

【问题讨论】:

  • mpi_bcast 是一个集体操作,指定的通信器中的所有进程(在您的代码MPI_COMM_WORLD 中)都进行调用,它的设计目的是从根进程广播到所有其他进程流程,所以我不确定它是否适合用于您预期的通信模式。我想我会以您想要的模式匹配 mpi_sendmpi_recv
  • 尽管理论上可以创建 n-1 个子通信器,其中 i-th 子通信器包含从 MPI_COMM_WORLD0i-1 的等级,这将允许您使用 MPI_BCAST ,可能会有更有效的解决方案。你到底想完成什么?
  • 我要解决的问题是将矩阵缩减为行缩减梯形。在我上面发布的代码之前,我有行缩减形式的矩阵(对角线以下的元素是 0)。您在上面看到的步骤本质上是逆运算,将对角线以上的元素减少到 0。
  • 为什么要将矩阵传递给其他进程?如果他们要对其进行操作,您的问题听起来像是可以使用 MPI_Scan。使用用户定义的操作,这可能适合您。

标签: matrix process parallel-processing mpi communication


【解决方案1】:

我按照高性能标记的建议实现了匹配的 mpi_send 和 mpi_recv。当我通过这种方法想到这个问题时,这个问题立即变得有意义。

【讨论】:

    猜你喜欢
    • 2012-08-12
    • 2011-07-26
    • 2014-02-23
    • 2021-02-17
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 2016-01-22
    • 2018-06-29
    相关资源
    最近更新 更多