【问题标题】:Could I declare a table of bits?我可以声明一个位表吗?
【发布时间】:2011-12-10 05:21:55
【问题描述】:

我正在构建一个 MPI 应用程序。为了减少正在传输的消息的大小,我正在考虑使用“位”表来表示 bool 表(因为 bool 值只能采用以下两个值之一:truefalse )。这对我来说很重要,因为通信是我的应用程序的主要性能瓶颈。

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

【问题讨论】:

标签: c++ fortran communication mpi bit


【解决方案1】:

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

【讨论】:

  • 一个很好的通用答案,但我敢打赌提问者对 MPI 界面更感兴趣。
  • @MarkRansom 我希望 OP 知道如何将用户定义的类型与 MPI 一起使用。否则整个问题似乎毫无意义。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    如果您的消息很小(比如不到 1 MB),那么您可能会受到消息延迟而非带宽的支配,减少消息大小也无济于事。 (您可以使用 pingpong 测试来估计这一点——比如在Intel MPI benchmarks 中——看看你的有效带宽水平的大小)。如果这是您所处的状态,那么这可能会使事情变得更糟,而不是更好,因为通信不会加快,但索引到位数组的额外成本可能会减慢速度。

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

    【讨论】:

      【解决方案4】:

      我会将你的位转移到一个整数数组中。

      我将回答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 表必须非常大才能看到任何效果,我们说的是多大?

      【讨论】:

        猜你喜欢
        • 2019-05-06
        • 2015-02-02
        • 1970-01-01
        • 2021-04-23
        • 2017-10-09
        • 1970-01-01
        • 2011-03-20
        • 2022-01-09
        • 2020-07-27
        相关资源
        最近更新 更多