假设我有两个进程A和B. A正在向B发送一些数字。但是B不知道有多少。 B使用MPI_Probe来探测项目数,然后分配缓冲区来接收这些数字。
我在使用PMPI接口拦截发送和接收呼叫。我的目标是减少网络流量。所以我决定通过拦截MPI_Send调用压缩想要发送的缓冲区A.压缩之后,我发送的是字节,而不是发送A最初想要发送的n个字节。其中r是压缩比并且r <1。
由于B正在使用MPI_Probe,因此B看到接收调用正在获取rn字节并为rn字节分配缓冲区。但我想要做的是截取MPI_Recv并解压缩n个字节中的rn个字节并填充B想要那些数据的缓冲区。
现在我的问题是,我怎么能告诉B虽然我发送rn字节,但是我希望它为n个字节分配内存?我无法访问A或B的代码。我所能做的只是使用PMPI接口。
答案 0 :(得分:3)
邮件大小信息来自MPI_Probe
和MPI_Recv
,是MPI_Status
对象的一部分。 MPI_Status
包含三个可公开访问的字段,即MPI_SOURCE
,MPI_TAG
和MPI_ERROR
。除此之外,它还包含其他信息,其中包括实际的消息大小,但实现不透明,不应直接访问私有字段,因为这些字段非常具有实现和版本。 MPI标准提供了一组&#34; getters&#34;和#34; setters&#34;应该用于提取或设置消息元素的数量。吸气剂是众所周知的,例如MPI_Get_count
,MPI_Get_elements
等。只有一个二传手:
MPI_STATUS_SET_ELEMENTS(status, datatype, count)
您应该能够使用MPI_BYTE
设置正确的邮件大小(以字节为单位)。
请注意,您应该能够在实际接收之前恢复未压缩消息的大小,即您应该以某种方式将其包含在消息信封中(强烈依赖于实现)或通过单独的隐藏消息传输它(引入额外的延迟,从而可能否定使用压缩的收益)。
在任何情况下,有几个项目试图使用PMPI实现MPI数据的透明压缩。你应该看看例如that one并可能尝试与其背后的人联系。他们可能愿意分享他们的代码或至少一些实现细节。