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