MPI_Bcast 接收方和发送方之间的同步
MPI_Bcast synchronization between receiver and sender
想象一下,有 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 调用是作为发送方操作执行的。我还打印了接收到的临时矩阵的内容,它们不是我期望的那样。
除了试图纠正这个混乱之外,我还想了解一下如何解决这个特定的沟通问题。我觉得我是从错误的方向来处理这个问题的。如果您有任何建议,请告诉我!
我按照 High Performance Mark 的建议实施了匹配的 mpi_send 和 mpi_recv。通过这种方式想到这个问题马上就明白了。
想象一下,有 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 调用是作为发送方操作执行的。我还打印了接收到的临时矩阵的内容,它们不是我期望的那样。
除了试图纠正这个混乱之外,我还想了解一下如何解决这个特定的沟通问题。我觉得我是从错误的方向来处理这个问题的。如果您有任何建议,请告诉我!
我按照 High Performance Mark 的建议实施了匹配的 mpi_send 和 mpi_recv。通过这种方式想到这个问题马上就明白了。