【问题标题】:How to programmatically define MPI types?如何以编程方式定义 MPI 类型?
【发布时间】:2021-06-09 19:33:21
【问题描述】:

我正在编写一个具有抽象结构的面向对象程序。每个结构都有成员变量,具体取决于继承者的实现。

struct abstract
{};

struct concrete: abstract
{
    int data[5][10];
};

struct concrete2: abstract
{
    int data[20];
    std::string s;
};

我需要一种方法来使用 MPI_Send 在 MPI 进程之间序列化和发送这些结构。

有没有办法以编程方式为每个单独的结构实现定义 MPI_Datatypes?理想情况下,我可以使用函数来定义类型,而不管结构内部是什么。这样的事情可能吗?

MPI_Datatype myType;
concrete2 myStruct;
figureOutMPIType(&myStruct, &myType);

MPI_Send(&myStruct, 1, myType, 1, 0, MCW);

【问题讨论】:

  • std::string 绝对做不到。对于基本类型的struct,请参阅MPI_Type_create_struct
  • 您可能需要考虑 C++ 抽象,例如 Boost.MPI 或 Elementals

标签: c++ struct multiprocessing mpi


【解决方案1】:

发送数据时,发送了指向该数据的指针。我们想发送一个指针来指示要发送哪些数据,但是由于数据可能是不连续的和/或不同类型的,我们需要创建一个要发送的数据类型和大小的列表以及该数据的偏移量数据的内存位置来自指针。

为此,您需要执行以下步骤:

  • 构建我们试图创建 MPI 数据类型的数据的临时对象 为。

  • 然后存储有关将组成的各个变量的信息 MPI 数据类型

  • 然后获取指向该变量的指针(以 MPI 友好格式存储)

  • 已为所有希望的成员变量收集此数据 要使用这种 MPI 数据类型发送,我们可以计算内存中的偏移量 地点:

    获取对象开头的内存位置 MPI_Get_address (&temp, add_start);

    然后从所有地址中减去它以获得它们的偏移量

    offsets[i] = addresses[i];
    add_start;
    
  • 一旦我们掌握了所有这些信息,我们就可以使用它来创建 MPI_datatype 的结构

MPI_Type_create_struct (4, block_lengths , offsets, typelist , & my_class MPI_type);
  • 一旦创建了数据类型的结构,就必须提交它 之前它可以用于任何通信(发送和接收)
MPI_Type_commit (&my_class::MPI_type);
  • 您可以像使用任何其他 MPI 变量一样使用此 MPI 数据类型发送它们 例如
MPI_Bcast (&data, 1, my_class::MPI_type , 0, MPI_COMM_WORLD);

MPI_Send (&data, 1, my_class::MPI_type , i, tag_num , MPI_COMM_WORLD);
  • 您需要在不再需要类型时释放它们
MPI_Type_free(&my _class::MPI_type);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    相关资源
    最近更新 更多