3

我的问题很简单,MPI_Scatter 函数定义是:

#include <mpi.h>
void MPI::Comm::Scatter(const void* sendbuf, int sendcount,
const MPI::Datatype& sendtype, void* recvbuf,
int recvcount, const MPI::Datatype& recvtype,
int root) const

'sendcount' 和 'sendtype' 是多余的吗?在这种情况下会发生:sendcount!=recvcount?

编辑:也许需要对这个问题进行一些澄清。我知道原因可能是,对于根来说,数据是一些“结构 X”,而对于接收者来说,数据是一些“结构 Y”,这在某种程度上也是有意义的(这一切都符合“好的”)。

如果是这样的话......我不明白为什么需要再次说要接收的预期数据的总大小与发送的数据大小相同。如果只是投射数据视图的问题,我只会进行投射。实际上,缓冲区是一个(void *)。

4

2 回答 2

4

MPI 允许发送端和接收端的数据类型不同,只要它们是由相同的基本数据类型构成的。在许多情况下,这很方便,例如将矩阵的行从根进程分散到其他进程的列中。在 C 和 C++ 中发送和接收行很简单,因为矩阵的内存布局是行优先的。发送和接收列要求首先构造一个特殊的跨步向量类型。通常这种类型是为指定数量的行和列构造的,然后必须1在接收数据时提供计数。

还有许多其他情况可能sendcountrecvcount有所不同。还请注意,recvcount 它没有指定要接收的消息的大小,而是指定接收缓冲区的容量,并且该容量可能比消息的大小大得多。

于 2012-09-21T13:07:21.170 回答
0

MPI_scatter()用于将消息分成相等的片段,并在子节点和您自己的节点中处理每个消息。知道这一点:

'sendcount' 和 'sendtype' 是多余的吗?

- 这怎么会发生?如果 sendCount 是发送的元素数,而 sendType 是这些元素的类型。两者都包含不同的信息。

对于最后一个问题:

在这种情况下可能会发生:sendcount!=recvcount?。

- 当你想对一个数字序列进行排序时,你将大小为 N 和 type=int 的块发送到你的节点。您想要相同但已排序。

于 2012-09-21T11:04:20.783 回答