This question already has answers here:
Count each bit-position separately over many 64-bit bitmasks, with AVX but not AVX2
(5个答案)
1年前关闭。
更新:请阅读代码,这与在一个int 中计数位数无关。
是否可以使用一些巧妙的汇编程序来提高以下代码的性能?
更新:
体系结构:x86-64,Sandy Bridge,因此可以使用SSE4.2,AVX1和较旧的技术,但不能使用AVX2或BMI1/2。
(5个答案)
1年前关闭。
更新:请阅读代码,这与在一个int 中计数位数无关。
是否可以使用一些巧妙的汇编程序来提高以下代码的性能?
uint bit_counter[64];
void Count(uint64 bits) {
bit_counter[0] += (bits >> 0) & 1;
bit_counter[1] += (bits >> 1) & 1;
// ..
bit_counter[63] += (bits >> 63) & 1;
}
Count
在我算法的最内层循环中。更新:
体系结构:x86-64,Sandy Bridge,因此可以使用SSE4.2,AVX1和较旧的技术,但不能使用AVX2或BMI1/2。
bits
变量几乎具有随机位(接近一半的零和一半的零) 最佳答案
也许您可以一次完成8个操作,方法是将8位以8位间隔并保持8个uint64计数。但是,每个计数器只有1个字节,因此,在必须解压缩这些uint64的文件之前,您只能累积255次count
的调用。
关于c++ - 如何在Sandy Bridge上的一系列int中快速将位计入单独的容器中? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7793997/
10-10 22:51