我需要MPI_Gatherv()一些int/string对。假设每一对都是这样的:
struct Pair {
int x;
unsigned s_len;
char s[1]; // variable-length string of s_len chars
};如何为Pair定义合适的MPI数据类型?
发布于 2010-02-16 23:40:17
简而言之,理论上不可能发送一条可变大小的消息并将其接收到完美大小的缓冲区中。您必须发送第一条消息,其中包含每个字符串的大小,然后发送第二条消息,其中包含字符串本身,或者将该metainfo编码到有效负载中并使用静态接收缓冲区。
如果必须只发送一条消息,那么我将放弃为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;
}但是,请注意,只有在发送和接收系统上整数和字符的数据表示相同时,此解决方案才有效。
发布于 2010-02-15 19:43:22
我不认为你可以用MPI做你想做的事情。我是一个Fortran程序员,所以如果我对C的理解有一点不稳定,请容忍我。您似乎想要从一个进程向另一个进程传递一个由1个int和1个string (通过传递字符串中第一个字符的位置来传递)组成的数据结构?我认为你要做的就是传递一个固定长度的字符串--因此,它必须和你真正想要传递的字符串一样长。用于聚集这些字符串的接收区域必须足够大,以便接收所有字符串及其长度。
您可能希望为结构声明一个新的MPI数据类型;然后可以收集这些数据,因为收集的数据包括字符串的长度,所以可以在接收方恢复字符串的有用部分。
我不确定这一点,但我从来没有遇到过你想要使用的真正可变的消息长度,而且它确实感觉不像MPI。但它可能是在最新版本的MPI中实现的东西,我只是从来没有偶然发现过,尽管在线文档看起来并非如此。
发布于 2010-02-19 10:49:38
MPI实现不会检查或解释消息的实际内容。只要你知道数据结构的大小,你就可以用一定数量的char或int来表示这个大小。MPI实现不会知道或关心数据的实际内部细节。
发送者和接收者需要就消息内容的解释达成一致,并且在发送和接收端提供的缓冲区需要适合某些可定义数量的字符或整型( caveats...both )。
https://stackoverflow.com/questions/2258759
复制相似问题