在 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 &lt; 运算符的指针?

【问题讨论】:

Vertex::operator&lt; 是一个成员函数(具有特殊语法)。您只需要使用 MPI 库“序列化”成员变量。另请注意,MPI 进程具有不同的地址空间,因此您不能传递指针并由目标进程使用。 你是说当我调用MPI_Type_create_struct 时我可以忽略操作员,仍然使用vertices.insert(std::pair&lt;int, Vertex&gt;(a, a_node));std::map&lt;int, Vertex&gt; vertices; 吗? 您甚至根本不需要定义您的Vertex::operator&lt;。相反,您可以为您的std::map 提供一个自定义比较器函数对象作为构造函数参数。我更喜欢&lt; 运算符的解决方案,只是说您如何考虑整个问题。 创建自定义(派生)MPI 类型是为了传递数据。运算符&lt;不代表数据,它是一个函数 如果您不想发送/接收操作员(我什至不确定这意味着什么),那么您可以MPI_Type_create_resized()您的数据类型。 【参考方案1】:

我的问题无效。不需要在 MPI 中传递运算符,因为 MPI 关心的是传递数据,而不是函数。

感谢您的 cmets。

【讨论】:

以上是关于在 C++ 中使用排序运算符 < 定义 MPI 结构的主要内容,如果未能解决你的问题,请参考以下文章

[C++]——日期类运算符的重载(针对Date类重载<,>,<=,>=,==,++,<<,>>运算符,并构建排序函数,将时间进行升序排序)

在 C++ 中的重载运算符中使用局部变量

在 C++ 中重载比较运算符会导致“无效运算符<”

C ++无效运算符<使用排序时

c++如何在不改变输入顺序的情况下去重输出?

priority_queue C++