This question already has answers here:
Count each bit-position separately over many 64-bit bitmasks, with AVX but not AVX2

(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