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
?
答案 0 :(得分:0)
知道连续内存部分的大小后,您就可以将所有内容作为MPI_CHAR
发送。这可能是发送所需内容的一种非常灵活的方式。我会认为它就像一个文本/二进制文件,在其中您确切地知道如何保存数据。这个想法类似于重载operator=
以便能够复制对象。例如,您可以创建字符串流,向其中写入该类的重要内容(可能是完整内容)。然后使用string
和voila将其转换为const char *
/ str().c_str()
,所有内容都可以作为MPI_CHAR
发送。二进制数据也可以做类似的事情。如果选择这种方式,请确保在通讯未完成时将const char *
保留在内存中。
在这种情况下,接收到的数据需要像文本/二进制文件一样进行处理,以再次构建对象数组。我想,与其他传输复杂对象的方式相比,这相对容易些,并且不需要其他库。