假设我有两个进程A和B。A正在向B发送一些数字,但是B不知道有多少。B使用MPI_Probe探测项目的数量,然后分配一个缓冲区来接收这些数量。
我正在使用PMPI接口截取中的发送和接收调用。我的目标是减少网络流量。因此,我决定通过拦截MPI_Send调用来压缩缓冲区A想要发送的内容。压缩后,我发送的不是A最初想发送的n个字节,而是rn个字节。其中r是压缩率和r<1。
由于B正在使用MPI_Probe,因此B看到接收调用正在获取rn个字节,并为rn个字节分配缓冲区。但我想要做的是截取MPI_Recv并解压缩成n字节的rn字节,然后在B想要这些数据的地方填充缓冲区。
现在我的问题是,我如何告诉B,虽然我正在发送rn个字节,但我希望它为n个字节分配内存?我拿不到A或B的密码。我所能做的就是使用PMPI接口。
发布于 2015-10-13 15:03:16
消息大小信息来自MPI_Probe和MPI_Recv,它们是MPI_Status对象的一部分。MPI_Status包含三个可公开访问的字段,即MPI_SOURCE、MPI_TAG和MPI_ERROR。除此之外,它还包含其他信息,其中包括实际的消息大小,但是实现是不透明的,并且不应该直接访问私有字段,因为这些字段是特定于实现和版本的。MPI标准提供了一组“getter”和“setter”,用于提取或设置消息元素的数量。setter是众所周知的,例如MPI_Get_count、MPI_Get_elements等。只有一个setter:
MPI_STATUS_SET_ELEMENTS(status, datatype, count)您应该能够使用MPI_BYTE设置正确的消息大小(以字节为单位)。
请注意,您应该能够在实际收到消息之前恢复未压缩消息的大小,即您应该以某种方式将其包含在消息信封中(强烈依赖于实现),或者通过单独的隐藏消息传输它(引入额外的延迟,因此可能会抵消使用压缩的好处)。
在任何情况下,都有几个项目试图使用PMPI实现MPI数据的透明压缩。例如,你应该看看that one,并可能尝试与它背后的人建立联系。他们可能愿意分享他们的代码或至少部分实现细节。
https://stackoverflow.com/questions/33095266
复制相似问题