64 位整数的按位运算成本与 8 位整数相同吗?
Is the cost of bitwise operations on 64-bit integers the same as 8-bit integers?
我的代码涉及对大量整数进行按位运算。
如果理解正确的话,64 位计算机在一个时钟周期内对 64 位整数进行计算。如果我在做一个8位整数的按位运算,它仍然消耗1个时钟周期。如果我做8个8位整数运算,会消耗8个时钟周期。知道我可以将八个 8 位整数放入一个 64 位整数,并对 64 位整数进行按位运算,我会消耗 1 个时钟周期而不是 8 个时钟周期吗?
即使在64位机器上,64位操作所占用的时钟周期数也不能保证为1,但显然处理器不知道64位值是否代表一个64-位或八个 8 位整数,因此按位运算本身对于这两种情况都一样快。 代码的这一部分 几乎肯定也会对单个 64 位值执行得更好,因为 64 位处理器可能适用于 64 位(或至少 32 位)数量即使你对较小的变量进行操作。
对于程序的整体性能,很大程度上取决于您需要多久在 8 位和 64 位数据之间进行转换;存储在 64 位整数数组中的单个 8 位整数的典型索引类似于 (a[i / 8] >> ((i % 8) * 8)) & 0xFF
- 所以至少在 C 端† 如果经常这样做会增加复杂性,但如果你的大部分对数组的所有元素重复操作,那么无论如何 64 位解决方案都可能获胜(请记住,无论如何,编译器在处理 8 位变量时可能必须生成类似的掩码)。
† 您可能希望查看生成的汇编程序以验证实际的复杂性,根据指令集的不同,它看起来可能会有很大不同……
为矢量化运算的超快速度做好准备:使用 SSE2 或 AVX2 内在函数,您可以一次处理 128 或 256 位(_m128i _mm_and_si128
、_mm256_and_si256
等)。即将推出的 AVX512 扩展将一次允许 512 位!
我的代码涉及对大量整数进行按位运算。 如果理解正确的话,64 位计算机在一个时钟周期内对 64 位整数进行计算。如果我在做一个8位整数的按位运算,它仍然消耗1个时钟周期。如果我做8个8位整数运算,会消耗8个时钟周期。知道我可以将八个 8 位整数放入一个 64 位整数,并对 64 位整数进行按位运算,我会消耗 1 个时钟周期而不是 8 个时钟周期吗?
即使在64位机器上,64位操作所占用的时钟周期数也不能保证为1,但显然处理器不知道64位值是否代表一个64-位或八个 8 位整数,因此按位运算本身对于这两种情况都一样快。 代码的这一部分 几乎肯定也会对单个 64 位值执行得更好,因为 64 位处理器可能适用于 64 位(或至少 32 位)数量即使你对较小的变量进行操作。
对于程序的整体性能,很大程度上取决于您需要多久在 8 位和 64 位数据之间进行转换;存储在 64 位整数数组中的单个 8 位整数的典型索引类似于 (a[i / 8] >> ((i % 8) * 8)) & 0xFF
- 所以至少在 C 端† 如果经常这样做会增加复杂性,但如果你的大部分对数组的所有元素重复操作,那么无论如何 64 位解决方案都可能获胜(请记住,无论如何,编译器在处理 8 位变量时可能必须生成类似的掩码)。
† 您可能希望查看生成的汇编程序以验证实际的复杂性,根据指令集的不同,它看起来可能会有很大不同……
为矢量化运算的超快速度做好准备:使用 SSE2 或 AVX2 内在函数,您可以一次处理 128 或 256 位(_m128i _mm_and_si128
、_mm256_and_si256
等)。即将推出的 AVX512 扩展将一次允许 512 位!