【发布时间】:2012-06-02 20:07:38
【问题描述】:
假设我的 Java 程序的瓶颈确实是一些紧密循环来计算一堆矢量点积。是的,我已经分析过了,是的,它是瓶颈,是的,它很重要,是的,算法就是这样,是的,我已经运行 Proguard 来优化字节码,等等。
这项工作本质上是点积。如,我有两个float[50],我需要计算成对产品的总和。我知道处理器指令集的存在是为了快速批量执行此类操作,例如 SSE 或 MMX。
是的,我可以通过在 JNI 中编写一些本机代码来访问这些。事实证明,JNI 调用非常昂贵。
我知道你不能保证 JIT 会编译什么,什么不编译。有没有人曾经听说过使用这些指令的 JIT 生成代码?如果是这样,Java 代码有什么东西可以帮助它以这种方式编译吗?
可能是“不”;值得一问。
【问题讨论】:
-
最简单的查找方法可能是获取您能找到的最现代的 JIT,并使用
-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:+LogCompilation输出生成的程序集。您需要一个程序来运行矢量化方法足够多次以使其“热”。 -
或者看看源码。 download.java.net/openjdk/jdk7
-
“即将推出”到您附近的 jdk:mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2012-July/…
-
其实,根据this blog,如果“正确”使用,JNI 可以相当快。
-
可以在此处找到相关的博客文章:psy-lob-saw.blogspot.com/2015/04/…,其中包含矢量化可以发生并且确实发生的一般信息。除了向量化特定情况(Arrays.fill()/equals(char[])/arrayCopy)之外,JVM 还使用 Superword 级并行化自动向量化。相关代码在 superword.cpp 中,基于的论文在这里:groups.csail.mit.edu/cag/slp/SLP-PLDI-2000.pdf
标签: java floating-point jit sse vectorization