MPI中的可变大小消息

3

是否有库调用可以使用 MPI 发送/接收可变大小的消息?

一种解决方法是在第一条消息中发送数据大小,然后跟随实际负载,但我想知道是否有结合这两个分开的消息的约定。


一般情况下,使用大小和有效负载的两条消息是传递消息的首选方法,其中大小在运行时不确定。 - Stan Graves
这是一种解决方法,但并不简单,因为两个消息可能会干扰另一个线程中的一对消息。Douglas Gregor和其他人在这篇论文中讨论了线程安全的方法https://www.researchgate.net/publication/228737912_Dynamically-Sized_Messages_in_MPI-3,并提出了使用标准方式来解决此问题的理由。 - alfC
2个回答

2

MPI_Recv提供的计数仅为上限。可以使用MPI_Get_count来查找接收到的确切项目数。

有点像套接字,我猜。


1
唯一需要注意的是,传递给MPI_Recv的计数和缓冲区大小应该保持一致。如果事先可以对消息大小做出合理的限制,这将是一种有效的技术。否则,为了适应一般情况,将会有一些能够容纳32位数据类型计数的缓冲区存在。这可能会严重膨胀内存占用。 - Stan Graves
你能否添加一个例子?你会使用 MPI_Get_count() 然后类似于 malloc(sizeof(char)*getCountResult),然后将结果缓冲区传递给 MPI_Recv() 吗? - binki

2
您也可以使用 MPI_ProbeMPI_Iprobe 来代替使用 MPI_RecvMPI_Irecv 发送接收请求。如果使用不当,Probe/Iprobe 可能会有性能劣势,但它们是处理可变大小消息的一种常见方法。此外,在多线程环境中要小心,因为 Probe/Iprobe 在某些多线程上下文中不安全。请参阅 Hoefler et al. 对这些问题进行全面讨论,并概述 MPI-3 中可能包含的修复(Mprobe)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接