我能宣布一个比特表吗?

时间:2011-10-18 15:31:49

标签: c++ fortran communication mpi bit

我正在构建一个MPI应用程序。为了减少正在传输的消息的大小,我正在考虑使用“bits”表来表示bool个表(因为bool值只能取两个值中的一个:{{1 }或true)。在我的情况下这很重要,因为通信是我的应用程序中的主要性能瓶颈。

是否可以创建这种表?此数据类型是否存在于MPI API中?

4 个答案:

答案 0 :(得分:4)

在C ++中,std::bitsetboost::dynamic_bitset可用于管理多个位。如果未修复位集的大小,请选择稍后的选项。 AFAIK MPI使用MPI_SendMPI_Rec进行进程间通信。如何序列化输出并通过这些接口发送它们是另一回事,因为Boost.Serialization不支持这两种类型。

答案 1 :(得分:1)

基于原始问题中的标记,我假设您使用的是Fortran和C ++的混合。 Fortran的MPI绑定具有数据类型MPI_LOGICAL,您可以在消息传递调用中使用它。我不知道MPI C绑定的这种类型。正如PlasmaHH所建议的,在这种情况下发送整数可能对你有用。

https://computing.llnl.gov/tutorials/mpi/#Derived_Data_Types

答案 2 :(得分:1)

简短回答 - 不,最短的MPI数据类型是MPI_BYTE,你不能创建一个只是一点点的类型。 (fortran绑定具有MPI_LOGICAL,它对应于本地逻辑类型,但几乎总是对应于int或可能是一个字节,而不是一点)。

现在,这不一定是个问题;如果你有一个位数组,你可以只舍入到下一个整数字节,并发送它,然后忽略最后几位。 (无论如何,这几乎都是你在表创建中必须做的事情)。但我有一些问题。

您的邮件有多大?你的网络是什么?您确定您的带宽有限,而不是延迟受限?

如果您的消息很小(例如在MB下),那么您很可能会受到消息延迟的影响,而不是带宽,减少消息大小也无济于事。 (您可以使用乒乓球测试来估算这一点 - 比如在Intel MPI benchmarks - 来查看您的有效带宽水平的大小)。如果这是你所处的政权,那么这可能会使事情变得更糟,而不是更好,因为通信不会加速,但是将数据编入索引的额外成本可能会减慢速度。

另一方面,如果您发送大型消息(比如MB大小)和/或内存有限,这可能是一件好事。

答案 3 :(得分:0)

我会将您的位转换为整数数组。

我将回答FORTRAN语言。 您可以使用固有位操作来回移动位。

另外要清除,不应使用FORTRAN类型LOGICAL,因为它是一个4字节变量,就像常规整数一样。 使用这些功能:

BIT_SIZE(I)
IBCLR(I, POS) ! Set to 0 in variable I at position POS
IBSET(I, POS) ! Set to 1 in variable I at position POS
BTEST(I, POS) ! To test if bit at POS is 1

然后以您正在处理的任何类型进行正常转移。您可以在MPI通信中添加标签,让接收方知道它是一个应按位处理的变量。 这应该限制您的通信,但也需要打包数据和外包。在任何情况下,您也可以将所有BOOL表转移到此方案。

但是应该注意到你的BOOL表必须非常大才能看到任何效果,我们说的有多大?