1

我目前正在大学里开始一个关于 ps3 的项目,我们得到了代码优化程度的分数。

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

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

4

2 回答 2

4

如评论中所述:

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

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

  • 它们操作起来很复杂,并且不会在内存使用上产生巨大的节省。如果您的值小到足以保证一个位域,那么 achar应该可以充分地完成这项工作,a 中的 8 位charint_3232 位相比,不会增加访问数据的开销。
  • 它们是特定于实现的——当心。

一般经验法则:

  • 让它起作用
    • 如果慢,让它工作得更快
    • 如果太大,让它更紧凑

(请注意,如果您知道要存储的内容,则可以预先估计大小。直到您开始优化缓存线(速度和内存位),只要它“适合”,您可能可以给出自己对内存使用情况打勾)

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

于 2014-10-30T16:20:25.227 回答
1

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

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

根据您的应用程序,您可能会对 SPU 的实际性能感到有些失望,而且 OpenCL、OpenMP 或 OpenACC 都不是灵丹妙药。并行是困难的。

于 2014-10-30T16:31:07.537 回答