C ++中带有对象数组的MPI散点图

时间:2018-06-21 15:54:37

标签: c++ parallel-processing mpi openmpi

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

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)的proc中,如下所示:

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

现在所有proc在recv_data中都有split数组。

但是现在,如果send_data是对象数组怎么办?例如,send_data定义为

SomeClass *send_data

在这种情况下,应该将MPI::DOUBLE中的数据类型用于替代MPI_Scatter

1 个答案:

答案 0 :(得分:0)

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

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