我的代码涉及对一个庞大的整数数组执行按位操作。如果正确理解,64位计算机在一个时钟周期内对64位整数进行计算.如果我在执行8位整数位的位运算,它仍然会消耗一个时钟周期.如果我做8个8位整数运算,它将消耗8个时钟周期.知道我可以将8个8位整数拟合成一个64位整数,并对64位整数执行按位运算,我会消耗1个时钟周期而不是8个时钟周期吗?
发布于 2015-02-17 06:46:23
即使在64位机器上,64位操作的时钟周期也不能保证为1,但显然处理器不知道64位值代表一个64位整数还是8个8位整数,因此按位运算本身对于这两种情况都是一样快的。代码的这一部分对于单个64位值也几乎肯定会表现得更好,因为64位处理器可能在64位(或至少32位)数量上工作,即使您对较小的变量进行操作。
对于程序的总体性能而言,这在很大程度上取决于您需要在8位和64位数据之间转换的频率;存储在64位整数数组中的单个8位整数的典型索引将类似于(a[i / 8] >> ((i % 8) * 8)) & 0xFF --因此,至少在C端†上,如果经常这样做,将增加复杂性,但是如果对数组的所有元素重复执行大部分操作,那么64位解决方案无论如何都有可能获胜(请记住,编译器在处理8位变量时可能需要生成类似的掩蔽)。
†您可能希望查看生成的汇编程序来验证实际的复杂性,但根据指令集…的不同,它看起来可能很不一样。
发布于 2015-02-17 09:07:24
准备好使用矢量化操作来加速速度:使用SSE2或AVX2本质,您可以在一次go中处理128或256个位(_m128i _mm_and_si128、_mm256_and_si256等)。而即将推出的AVX512扩展一次将允许512位!
https://stackoverflow.com/questions/28555013
复制相似问题