使用位字段保存内存

Using Bit Fields to save memory

本文关键字:保存 内存 字段      更新时间:2023-10-16

我目前正在大学里启动一个关于ps3的项目,我们对代码的优化程度进行了评分。

我和我的合作伙伴一直在研究比特字段,因为我们处理的是0到255之间的数百万个数字。我们认为,如果我们可以将4个整数打包到4个字节(典型的整数大小的内存块)中,而不是只有一个,那么我们就可以将使用的内存减半。我们认为处理数据是我们能做出的最大优化之一,我们正在调查一切。这么麻烦值得吗?就编辑int而言,这似乎是一件很难处理的事情。我们还存在这样的问题,即理想情况下,我们需要取决于数字的不同比特字段,因为多达255需要9个比特,但大多数不需要这么多比特。

然后,我们还可以将数据快速传递给spu处理器,并有望在代码中引入并行性时看到巨大的改进。

如注释所述:

"优化通常是速度和空间之间的权衡。位字段可以节省空间,但处理速度比整数慢。"

由于的几个原因,很少使用位字段

  • 它们操作起来很复杂,而且往往不会在内存使用方面产生巨大的节约。如果您的值足够小,可以保证有一个位字段,那么char应该能胜任这项工作,char中的8位与32的int_32相比,不会增加访问数据的开销
  • 它们是特定于实现的-小心

一般经验法则:

  • 让它发挥作用
    • 如果速度较慢,请使其工作得更快
    • 如果太大,请使其更紧凑

(注意,如果你知道要存储什么,你可以提前估计大小。在你开始优化缓存线(速度和内存都有一点)之前,只要它"合适",你可能会在内存使用情况上打勾)

仅供参考,位字段最常见的用法是将数据打包到为传输而设计的数据结构中。这只是我能找到的第一个例子

您只需要来自<cstdint> C++标头(或C99中的<stdint.h>)的int8_t(有符号)或uint8_t(无符号)8位整数。无需使用位字段(这些字段不可启动、速度慢且不易使用,例如,您无法获取它们的地址或引用)。

对于并行矢量处理,也可以考虑OpenCL和OpenMP,最终考虑OpenACC。最好使用最新的编译器,它也支持C++11。请注意,SPU是非常特定于硬件的。

根据您的应用程序,您可能会对SPU的实际性能感到有点失望,而OpenCL、OpenMP或OpenACC都不是银弹。Parallelism很难