64位整数的按位运算的成本是否与8位整数相同?

时间:2015-02-17 05:06:27

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

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

2 个答案:

答案 0 :(得分: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位变量时可能必须生成类似的掩码)。

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

答案 1 :(得分:0)

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