【发布时间】: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 来做到这一点