C 是否可以使用PMPI接口更改MPI_探头的计数?

C 是否可以使用PMPI接口更改MPI_探头的计数?,c,mpi,C,Mpi,假设我有两个进程A和B。A向B发送一些数字。但B不知道有多少。B使用MPI_探测器探测项目的数量,然后分配一个缓冲区来接收这些数字 我正在使用PMPI接口拦截发送和接收调用。我的目标是减少网络流量。所以我决定通过拦截MPI_发送调用来压缩A想要发送的缓冲区。压缩后,我发送的不是A最初想要发送的n个字节,而是rn个字节。其中r是压缩比,r消息大小信息来自MPI_探测和MPI_Recv,作为MPI_状态对象的一部分MPI\u状态包含三个可公开访问的字段,即MPI\u源,MPI\u标记,以及MPI\u

假设我有两个进程A和B。A向B发送一些数字。但B不知道有多少。B使用MPI_探测器探测项目的数量,然后分配一个缓冲区来接收这些数字


我正在使用PMPI接口拦截发送和接收调用。我的目标是减少网络流量。所以我决定通过拦截MPI_发送调用来压缩A想要发送的缓冲区。压缩后,我发送的不是A最初想要发送的n个字节,而是rn个字节。其中r是压缩比,r消息大小信息来自
MPI_探测
MPI_Recv
,作为
MPI_状态
对象的一部分
MPI\u状态
包含三个可公开访问的字段,即
MPI\u源
MPI\u标记
,以及
MPI\u错误
。除此之外,它还包含额外的信息,其中包括实际的消息大小,但实现是不透明的,不应该直接访问私有字段,因为这些字段非常特定于实现和版本。MPI标准提供了一组“getter”和“setter”,用于提取或设置消息元素的数量。getter是众所周知的,例如
MPI\u Get\u count
MPI\u Get\u元素
,等等。只有一个setter:

MPI_STATUS_SET_ELEMENTS(status, datatype, count)
您应该能够使用
MPI\u BYTE
以字节为单位设置正确的消息大小

请注意,即使在实际接收未压缩消息之前,您也应该能够恢复其大小,即您应该以某种方式将其包含在消息信封中(强烈依赖于实现),或者通过单独的隐藏消息进行传输(引入额外的延迟,从而可能抵消使用压缩带来的好处)


在任何情况下,都有几个项目试图使用PMPI实现MPI数据的透明压缩。您应该看看,例如,并可能尝试与背后的人员联系。他们可能愿意共享他们的代码或至少一些实现细节。

感谢您的回复。我曾尝试与他们联系过但从未收到他们的回音。我想的一个可能的途径是拦截MPI_Get_Count/元素,然后临时缓存接收。因此,如果调用后续接收,我可以将临时缓冲区复制到分配的缓冲区中。但这也引发了在没有Get_Count或Get_elemen的情况下调用MPI_Recv的问题哦,我错了。我完全忽略了“外部接口”一章中的大部分(模糊的)信息。实际上,可以在状态中移植设置计数值。我正在相应地编辑答案。