使用位域来节省内存

时间:2014-10-30 16:03:18

标签: c++ bit-manipulation ps3

我目前正在大学的ps3上开始一个项目,我们得到了如何优化代码的标记。

我和我的伙伴一直在查看位字段,因为我们正在处理0到255之间的数百万个数字。我们认为如果我们可以将4个整数打包成4个字节(典型的整数大小的内存块)而不是只有一个我们可以计算使用的内存。我们认为处理数据是我们可以做出的最大优化之一,我们正在研究一切。麻烦值得吗?就编辑内容而言,似乎很难继续下去。 我们还有一个问题,理想情况下我们需要依赖于数字的不同位字段,因为高达255需要9位,但大多数不需要这么多位。

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

2 个答案:

答案 0 :(得分:4)

如评论中所述:

  

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

由于几个原因,很少使用位域

  • 它们操作起来很复杂,并且不会对内存使用产生巨大的节省。如果你的值足够小以保证位域,那么char应该能够充分地完成工作,char对比8比特,带有32的int_32,而无需增加访问开销数据。
  • 他们是implementation specific - 小心。

一般经验法则:

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

(请注意,如果您知道要存储的内容,可以预先估算尺寸。直到您开始优化缓存线(速度和内存位),只要它“适合”,可能会给你自己一个关于内存使用的记录)

仅供参考,位域的最常见用法是将数据打包到专为传输而设计的数据结构中。 This is just the first example I could find

答案 1 :(得分:1)

您只需要来自<cstdint> C ++标头(或C99中的int8_t)的uint8_t(已签名)或<stdint.h>(无符号)8位整数。无需使用位字段(不可移植,缓慢且不易使用 - 例如,您无法使用其地址或参考)。

对于并行向量处理,也可考虑OpenCLOpenMP以及最终OpenACC。更好地使用最近的编译器,它也支持C++11。请注意SPU是非常特定于硬件的。

根据您的应用程序,您可能对SPU的实际性能表示有点失望,OpenCL,OpenMP或OpenACC都不是银子弹。并行性很难。