Vector APIはSIMD命令を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)
などとする必要があります。