【问题标题】:MPI_Scatter redundant parameters?MPI_Scatter 冗余参数?
【发布时间】:2012-09-13 09:17:12
【问题描述】:

我的问题比较简单,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 *)。

【问题讨论】:

    标签: parallel-processing mpi


    【解决方案1】:

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

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

    【讨论】:

    • 我仍然不明白为什么添加两个额外的参数是必要的,如果一切都可以修复(事实上,它会)做一个演员。
    • MPI 提供尽可能通用的接口。它来自科学和技术计算领域的人们,在这些领域中,具有许多参数的函数而不是同一函数的许多不同版本是很常见的。 MPI 上还有其他 C++ 包装器可以为您隐藏“不必要的”参数(此外,当前的 MPI C++ 绑定已被弃用,并将在 MPI 3.0 中删除)。
    【解决方案2】:

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

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

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

    最后一个问题:

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

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

    【讨论】:

    • 为什么 'sendcount' 和 'recvcount' 不同?,都是 N。
    • 哦,“mea culpa”:我一直看到 != 像“...ount=...”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多