【问题标题】:How to implement MPI_Datatype starting from scratch? (In a new OS)如何从头开始实现 MPI_Datatype? (在新操作系统中)
【发布时间】:2013-06-28 04:37:47
【问题描述】:

我正在尝试在 EPOS 操作系统中实现 MPI 协议。 此刻,我正在研究 MPI_Datatypes。 嗯,我写了一些mpi类型的文档,是这样的:

typedef unsigned int MPI_Datatype;

#define MPI_CHAR ((MPI_Datatype)1)

#define MPI_UNSIGNED_CHAR ((MPI_Datatype)2)

#define MPI_BYTE ((MPI_Datatype)3)

#define MPI_SHORT ((MPI_Datatype)4)

#define MPI_UNSIGNED_SHORT ((MPI_Datatype)5)

.....

但是,我觉得不好! 我怎么能明确写出 MPI_CHAR 相当于 1 字节字符 (C 语言中的 char 类型)。或者,例如,MPI_INT 等价于 32 位整数。那可能吗?我想要一些提示!非常感谢! (对不起,如果这个主题的标题不是那么容易理解!)。

【问题讨论】:

    标签: c mpi


    【解决方案1】:

    事实上,MPI_CHAR 并不等同于 char 类型:不能声明 MPI_CHAR 类型的变量。 MPI_CHAR 只是一个整数常量,它告诉 MPI 将数据处理为 chars 的序列。

    所以你做的很正确。

    然后,您应该将每个受支持的MPI_Datatype 映射到 MPI 实现处理 MPI_Datatype 值的位置的实际类型。例如。在MPI_Send 确定要发送的数据量时。

    【讨论】:

    • 是否可以做类似的事情:std::map my_mapping;我的映射[MPI_INT] = int; ???
    • 嗯,对于每个 MPI_Datatype,您需要知道这种类型的变量的大小,也许还需要知道内存对齐规则(这取决于您的目标平台)。所以你可以写std::map <MPI_Datatype, size_t> datatype_sizes; datatype_sizes[MPI_INT] = sizeof(int);之类的东西。如果您的 MPI 实现必须支持异构系统,则可能还存在 little-endian/big-endian 转换。事实上,从头开始实现 MPI 是一项相当复杂的任务(例如,你知道如何实现 MPI_Barrier() 吗?)。我建议采用现有的实现并将其适应您的系统。
    猜你喜欢
    • 2011-04-08
    • 2011-05-21
    • 1970-01-01
    • 2021-04-06
    • 2018-12-01
    • 2012-07-11
    • 1970-01-01
    • 2015-05-28
    • 2011-09-14
    相关资源
    最近更新 更多