【问题标题】:Is it possible to execute SIMD comparison instruction in Java8?是否可以在 Java8 中执行 SIMD 比较指令?
【发布时间】:2017-11-22 11:22:26
【问题描述】:

在 Java8 中,可以执行一些 SIMD 指令,如本文http://prestodb.rocks/code/simd/ 所说。

我想知道在Java8中是否可以执行SIMD比较指令。

我想检查两个字符(UTF-16,16 位数字)的相等性,如果它们相同,则获取 0xffff 的值,如果不是快速方式,则获取 0x0。我有一个大的 char 数组,我想通过循环数组在每个 char 元素和特定 char(例如 0x0022)之间执行上述相等性检查。

Java8可以执行SIMD比较指令吗?或者有什么按位操作或算法可以高效快速地执行字符比较?

谢谢。

【问题讨论】:

  • 最好的办法是遵循帖子中描述的方法:编写代码和基准测试。但是没有办法告诉 JIT 使用特定的 CPU 指令。另请注意,比较两个字符可能已经是一条指令。你检查过组装吗?
  • 您可以使用(char)((c-0x23)>>31&(0x21-c)>>31) 使其无分支(其中c 是您当前的char 值),但这是否仍然足够简单以进行矢量化,我不知道......
  • @bluesun 你怎么看?据我所知,矢量化将是 JIT 必须处理的内在调用
  • 您找到的文章已经包含您的问题的答案:“从 Java 8 开始,无法像在 C++ 或 C# 中那样直接在 Java 中使用 SIMD 内在函数,因为例如……不过,Java 在某些情况下也可以生成 SIMD 代码。如果它检测到循环的后续迭代执行独立计算,Java 可以尝试对此类循环进行向量化。”
  • @assylias 你可以实现你自己的内在函数,我见过人们用自定义的 JVM 来做到这一点

标签: java java-8 simd


【解决方案1】:

根据thisjdk-9 中的数组相等性被矢量化(尽可能快)

即使方法内部也有一个定义:

@HotSpotIntrinsicCandidate
static int vectorizedMismatch...

但这并没有移植到 jdk-8。

就按位操作而言,很多的操作已经被强化了;如@HotSpotIntrinsicCandidate 注解所示。

您最好使用以下几个选项进行实际测试:

 -XX:-TieredCompilation 
 -XX:CICompilerCount=1
 -XX:+UnlockDiagnosticVMOptions 
 -XX:+PrintCompilation 
 -XX:+PrintInlining 

并检查您是否有这样的条目:Unsafe::getAndAddInt (27 bytes) (intrinsic)

最后一个明显的点可能是你在这里的速度目标是多少?即使你没有得到你真正认为你想要的内在函数,速度也可能在你想要的范围内。

【讨论】:

    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 2015-06-05
    • 2015-08-02
    • 2012-03-09
    • 1970-01-01
    相关资源
    最近更新 更多