我需要MPI_Gatherv()一些int/string对.让我们说每一对看起来像这样:
struct Pair {
int x;
unsigned s_len;
char s[1]; // variable-length string of s_len chars
};
Run Code Online (Sandbox Code Playgroud)
如何为Pair定义合适的MPI数据类型?
简而言之,理论上不可能发送一个可变大小的消息并将其接收到一个大小合适的缓冲区中。您要么必须发送具有每个字符串大小的第一条消息,然后发送具有字符串本身的第二条消息,要么将该元信息编码为有效负载并使用静态接收缓冲区。
如果只发送一条消息,那么我将放弃为Pair定义一种数据类型:相反,我将为整个有效负载创建一个数据类型,并将所有数据转储到一个连续的,无类型的包中。然后,在接收端,您可以对其进行迭代,为每个字符串分配所需的确切空间,并将其填满。让我整理一下ASCII图进行说明。这将是您的有效载荷:
| ..x1 .. | ..s_len1 .. | ..string1 .... | .x2 .. | ..s_len2 .. | .string2。| ..x3 .. | ..s_len3 .. | ....... string3 ....... | ...
您将整个东西作为一个单元发送(例如,一个MPI_BYTE数组),然后接收器将对它进行解压缩,如下所示:
while (buffer is not empty)
{
read x;
read s_len;
allocate s_len characters;
move s_len characters from buffer to allocated space;
}
Run Code Online (Sandbox Code Playgroud)
但是请注意,仅当整数和字符的数据表示在发送和接收系统上相同时,此解决方案才有效。