我想知道当发送缓冲区在根目录下分配,但在其他行列中没有分配时,MPI集体通信如Bcast、Scatter、Gather等如何处理。
比如说
rowptr = (int*)malloc(sizeof(int) * (row_count + 1));
MPI_Scatterv(all_rows, rowCounts, rowDispls, MPI_INT,
rowptr, row_count, MPI_INT, MASTER, MPI_COMM_WORLD);
例如: all_rows
只在 MASTER (rank == 0)
流程。这种情况下MPI的行为是什么。
或者在下面的情况下。
MPI_Scatter(eCounts, 1, MPI_INT, &elm_count, 1, MASTER, MPI_COMM_WORLD);
其中 eCounts
是 int[]
和 elm_count
是 int
但 eCount
只在 MASTER
.
我是否也应该分配发送缓冲区,即使它们没有在其他行列中使用?
摘自MPI 3.1标准(5.6章第160页)
对于所有非root进程,发送缓冲区被忽略。
[...]
函数的所有参数在进程root上都是重要的,而在其他进程上,只有参数recvbuf、recvcount、recvtype、root和comm是重要的。
同样的故事也适用于 MPI_Gather()
而代 recv*
与 send*
.
所有 争论的重要性。MPI_Bcast()
缓冲区在根级上是发送缓冲区,其他级上是接收缓冲区)。