Vector APIを試す

Vector APISIMD命令をJavaから利用するためのAPIです。
Project Panamaの一部ということになっていますが、最近はなんかPanamaとは別扱いになってる気がします。

Vector APIはJEPがすでに作成されていて、感触としてはJDK 14に入りそうな勢い。
JEP 338: Vector API (Incubator)
※追記(2020/10/24) JDK16に入ることになりました。

ビルド

いまのところ簡単に試せるバイナリは提供されていないので、自分でビルドする必要があります。
※追記(2020/10/24) JDK16 ea21から取り込まれているのでビルド不要で試せます。

いままでJDKのビルドをするときにはソースをMercurialでとってきていましたが、OpenJDKのソースはGitHubにミラーされるようになったので、Gitを使うほうが断然速いです。

$ git clone https://github.com/openjdk/panama/

Vector APIはvectorIntrinsicsブランチで開発されていてmasterには取り込まれていないので、ブランチを切り替える必要があります。

$ cd panama
$ git checkout vectorIntrinsics

あとは通常どおりビルドします。

$ bash configure
$ make images

足りないライブラリがあればconfigure時に示してくれるはずなので、インストールして再び試すといいです。

JShellで試す

それでは、JShellで試してみましょう。Vector APIモジュールはデフォルトでは有効になっていないので、java / javac / jshell各コマンドに--add-modules jdk.incubator.vectorをつけてモジュールを読み込む必要があります。

$ build/linux-x86_64-server-release/images/jdk/bin/jshell --add-modules jdk.incubator.vector
|  Welcome to JShell -- Version 14-internal
|  For an introduction type: /help intro

jehsll> import jdk.incubator.vector.*

jshell> var SP = DoubleVector.SPECIES_256
SP ==> Species[double, 4, S_256_BIT]

jshell> var v1 = DoubleVector.fromValues(SP, 1, 2, 3, 4)
v1 ==> [1.0, 2.0, 3.0, 4.0]

jshell> v1.add(2)
$4 ==> [3.0, 4.0, 5.0, 6.0]

jshell> var v2 = DoubleVector.fromValues(SP, 2, 3, 4, 5)
v2 ==> [2.0, 3.0, 4.0, 5.0]

jshell> v1.add(v2)
$6 ==> [3.0, 5.0, 7.0, 9.0]

このように複数の値に対してひとつの命令で演算が行えることがわかります。
コードを書く際に最初に注意する点としては、パッケージはjdk.incubator.vectorに入っているということと、どの型のどのサイズのVectorを使うか示すためにSPECIESが必要、というところですね。
あとの演算は、JavaDocを見れば比較的わかりやすいんではないかと思います。
jdk.incubator.vector (Java SE 13 & JDK 13 [ad-hoc build])

気がむいたらAPIについてもまとめます。
※追記(2020/10/24) fromValuesは正式版からは外れてるようなので代わりにfromArray(SP, new double[]{1, 2, 3, 4}, 0)などとする必要があります。