【问题标题】:MPI Scatter with Array of Objects in C++C++ 中带有对象数组的 MPI 散点图
【发布时间】:2018-06-21 15:54:36
【问题描述】:

MPI_Scatter在C++中的函数原型如下:

MPI_Scatter(
    void* send_data,
    int send_count,
    MPI_Datatype send_datatype,
    void* recv_data,
    int recv_count,
    MPI_Datatype recv_datatype,
    int root,
    MPI_Comm communicator)

例如,我们可以将一个双精度数组 (send_data) 从根进程 (0) 分散到 procs 中,如下所示:

MPI_Scatter(send_data, send_count, MPI::DOUBLE, recv_data, recv_count, MPI::DOUBLE, 0, MPI_COMM_WORLD);

现在所有 proc 在recv_data 中都有拆分数组。

但是现在,如果send_data 是一个对象数组呢?例如,send_data 定义为

SomeClass *send_data

在这种情况下,MPI_Scatter 中的数据类型应该使用 MPI::DOUBLE,而不是 MPI::DOUBLE?

【问题讨论】:

  • 注意 MPI 处理连续内存中的数据(例如,不是指向对象的指针数组)。您可以创建与您的类匹配的派生数据类型。由于您使用的是 C++,因此您可能想看看 Boost.MPI 和 Boost.Serialization。这不是标准的 MPI,但这些库可能会使用一些黑魔法来传输 c++ 对象,而无需您手动创建派生数据类型。

标签: c++ parallel-processing mpi openmpi


【解决方案1】:

知道连续内存部分的大小,您可以将所有内容都发送为MPI_CHAR。这可能是一种非常灵活的方式来发送您想要的任何内容。我会将其视为文本/二进制文件,您可以在其中确切知道如何保存数据。这个想法类似于重载operator= 以便能够复制对象。例如,您可以创建字符串流,向其中写入类的重要内容(可能是完整内容)。然后将其转换为string / const char * 使用:str().c_str() 瞧,都可以作为MPI_CHAR 发送。二进制数据也可以做类似的事情。如果您选择这种方式,请确保在通信未完成时将const char *保留在内存中。

在这种情况下,接收到的数据需要像文本/二进制文件一样进行处理,以再次构建您的对象数组。与其他传输复杂对象的方法相比,我想这会相对容易,并且不需要额外的库。

【讨论】:

    猜你喜欢
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2017-11-18
    • 2014-11-07
    相关资源
    最近更新 更多