MPI_Scatter冗余参数?

时间:2012-09-20 23:12:27

标签: parallel-processing mpi

我的问题很简单,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?

编辑: 也许需要对这个问题做一些澄清。据我所知,原因可能是,对于根来说,数据是一些'struct X'而接收器是一些'struct Y',它在某种程度上也是有意义的(它都适合'Ok')。

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

2 个答案:

答案 0 :(得分:3)

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

sendcountrecvcount可能有所不同,还有很多其他情况。还要注意recvcount 指定要接收的邮件的大小,而是接收缓冲区的容量,并且该容量可能大于消息的大小。

答案 1 :(得分:0)

MPI_scatter()用于以相等的方式中断消息并处理子节点和您自己的节点中的每个消息。知道这个:

  

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

- 如果发生这种情况?,如果sendCount是发送的元素数,sendType就是这些元素的类型。两者都包含不同的信息。

关于最后一个问题:

  

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

- 如果要对数字序列进行排序,请将大小为N且type = int的块发送到节点。你想要相同但排序。