优化 Long.bitCount

我有一个程序对Long.bitCount()进行大量调用,调用如此之多,以至于它在一个CPU内核上占用了33%的周期。有没有办法实现它比Sun JDK版本更快?

我试过:

  • 这个算法(我认为这正是JDK实现它的方式)
  • 28 和 2 22 之间各种大小的查找表(一次查看几个位并添加结果)

但是,我能做的莫过于一个带有手动展开循环(约 27% CPU)的 2 个16 项查找表。
如何针对Java进行优化?


注意:这个问题是关于特定于Java的优化,但这个类似的(与语言无关的)问题还有许多其他算法。


答案 1

如果您使用的是最近的x86 CPU,则有一个指令,popcnt。

在最新版本的Java中,Long.bitCount()使用此指令。只需使用 -XX:+UsePopCountInstruction(这是最新版本中的默认设置)

但是,在JRE 6.0_u18 7.0_u5中存在一些错误:https://bugs.java.com/bugdatabase/view_bug.do?bug_id=7063674


答案 2

这似乎是GPU可以完美解决的问题之一。它应该能够将您的时间削减几个数量级。

否则,我认为你可能不得不在更高的层次上处理它。让多个线程一次处理不同的数据段(我相信你已经这样做了),在你收集数据时处理数据,在多个系统之间共享工作 - 类似的东西。


推荐