我想知道当发送缓冲区在根中分配但未在其他等级中分配时,诸如Bcast,Scatter,Gather等MPI集体通信的行为如何。
例如:
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 页(
对于所有非根进程,将忽略发送缓冲区。
[...]
函数的所有参数在进程根上都很重要,而在其他进程上,只有参数 recvbuf、recvcount、recvtype、root 和 comm 是重要的。
同样的故事MPI_Gather()
但recv*
替换为send*
。
在MPI_Bcast()
的情况下,所有参数都很重要(缓冲区是根秩上的发送缓冲区,其他秩上的接收缓冲区(。