【问题标题】:Is the cost of bitwise operations on 64-bit integers the same as 8-bit integers?对 64 位整数进行按位运算的成本是否与 8 位整数相同?
【发布时间】:2015-02-17 05:06:27
【问题描述】:

我的代码涉及对一个巨大的整数数组进行按位运算。 如果理解正确,64 位计算机在一个时钟周期内对 64 位整数进行计算。如果我正在执行 8 位整数按位运算,它仍然会消耗 1 个时钟周期。如果我做 8 个 8 位整数运算,它将消耗 8 个时钟周期。知道我可以将八个 8 位整数放入一个 64 位整数中,并对 64 位整数进行按位运算,我会消耗 1 个时钟周期而不是 8 个时钟周期吗?

【问题讨论】:

  • 很有可能,对 64 位字的操作会执行得更好,但如果您对整个数组的操作性能很重要,您需要衡量可能的方法。
  • 无法保证每个 64b 处理器都会在单个时钟周期内对 64b 整数进行任何按位操作。但是,对小于 64b 的值(例如 - 32b、8b 等)进行操作很可能会使用与对 64b 值相同的操作来完成——但它是否真的取决于处理器。

标签: c optimization 64-bit bit-manipulation rust


【解决方案1】:

即使在 64 位机器上,64 位操作所占用的时钟周期数也不能保证为 1,但显然处理器不知道 64 位值是代表一个 64 位还是八个 8 位整数,因此按位运算本身对于这两种情况都一样快。 这部分代码几乎肯定会在单个 64 位值上表现得更好,因为 64 位处理器可能在 64 位(或至少 32 位)数量上工作,即使您对较小的变量进行运算。

程序的整体性能很大程度上取决于您需要在 8 位和 64 位数据之间转换的频率;存储在 64 位整数数组中的单个 8 位整数的典型索引类似于(a[i / 8] >> ((i % 8) * 8)) & 0xFF - 所以至少在 C 方面†如果经常这样做会增加复杂性,但如果你的大部分操作都是对数组的所有元素重复,那么 64 位解决方案很可能会获胜(请记住,编译器在处理 8 位变量时可能必须生成类似的掩码)。

† 您可能希望查看生成的汇编程序以验证实际复杂性,根据指令集的不同,它可能看起来完全不同……

【讨论】:

    【解决方案2】:

    准备好通过矢量化操作获得超快的速度:使用 SSE2 或 AVX2 内在函数,您可以一次处理 128 或 256 位(_m128i _mm_and_si128_mm256_and_si256 和类似的)。即将推出的 AVX512 扩展将允许一次 512 位!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多