在 C++ 中使用排序运算符 < 定义 MPI 结构
Posted
技术标签:
【中文标题】在 C++ 中使用排序运算符 < 定义 MPI 结构【英文标题】:define an MPI struct with ordering operator < in C++ 【发布时间】:2018-07-15 16:10:12 【问题描述】:我有一个序列化程序的结构,我想与 MPI 并行化。我正在使用 MPICH。我的程序使用结构上的 ids 到顶点的映射,因此为了能够创建相同类型的映射,我需要将此运算符保留在我的结构中。
struct Vertex
int id;
int degree;
double credit;
bool operator <(const Vertex& x) return this->id < x.id;
;
我需要知道如何用 MPI 数据类型重新定义这个结构。到目前为止,我有这个......
MPI_Datatype vertex_type, oldtypes[3];
int blockcounts[4];
MPI_Aint offsets[4], extent_int, extent_double,
lower_bound_int, lower_bound_double;
offsets[0] = 0;
oldtypes[0] = MPI_INT;
blockcounts[1] = 1;
MPI_Type_get_extent(MPI_INT, &lower_bound_int, &extent_int);
offsets[1] = extent_int;
oldtypes[1] = MPI_INT;
blockcounts[1] = 1;
offsets[2] = 2*extent_int;
oldtypes[2] = MPI_DOUBLE;
blockcounts[2] = 1;
MPI_Type_get_extent(MPI_DOUBLE, &lower_bound_double, &extent_double);
offsets[3] = 2*extent_int + extent_double;
oldtypes[3] = MPI_Aint;
blockcounts[3] = 1;
MPI_Type_create_struct(4, blockcounts, offsets, oldtypes, &vertex_type);
MPI_Type_commit(&person_type);
我认为这不是在 MPI 结构中定义运算符的正确方法。我一直在寻找有关此的文档,但找不到任何有用的东西。
https://linux.die.net/man/3/mpi_double https://www.rc.colorado.edu/sites/default/files/Datatypes.pdf
有没有办法可以给我的 MPI 结构一个指向 Vertex <
运算符的指针?
【问题讨论】:
Vertex::operator<
是一个成员函数(具有特殊语法)。您只需要使用 MPI 库“序列化”成员变量。另请注意,MPI 进程具有不同的地址空间,因此您不能传递指针并由目标进程使用。
你是说当我调用MPI_Type_create_struct
时我可以忽略操作员,仍然使用vertices.insert(std::pair<int, Vertex>(a, a_node));
和std::map<int, Vertex> vertices;
吗?
您甚至根本不需要定义您的Vertex::operator<
。相反,您可以为您的std::map
提供一个自定义比较器函数对象作为构造函数参数。我更喜欢<
运算符的解决方案,只是说您如何考虑整个问题。
创建自定义(派生)MPI 类型是为了传递数据。运算符<
不代表数据,它是一个函数。
如果您不想发送/接收操作员(我什至不确定这意味着什么),那么您可以MPI_Type_create_resized()
您的数据类型。
【参考方案1】:
我的问题无效。不需要在 MPI 中传递运算符,因为 MPI 关心的是传递数据,而不是函数。
感谢您的 cmets。
【讨论】:
以上是关于在 C++ 中使用排序运算符 < 定义 MPI 结构的主要内容,如果未能解决你的问题,请参考以下文章
[C++]——日期类运算符的重载(针对Date类重载<,>,<=,>=,==,++,<<,>>运算符,并构建排序函数,将时间进行升序排序)