我正在尝试使用 Panama 项目中的 Java Vector API 向java.math.BigInteger
该类添加一些 SIMD 代码。我克隆了 Panama repo 并构建了一个 JDK:
hg clone http://hg.openjdk.java.net/panama/dev/
cd dev/
hg checkout vectorIntrinsics
hg branch vectorIntrinsics
bash configure
make images
我能够编译并运行一个使用矢量 API 的简单小程序:
import static jdk.incubator.vector.Vector.Shape.S_256_BIT;
import jdk.incubator.vector.IntVector;
import static jdk.incubator.vector.IntVector.IntSpecies;
public class Panama {
public static void main(String... args) {
IntSpecies int256Species = (IntSpecies)IntSpecies.of(int.class, S_256_BIT);
int[] arr = new int[] {1, 5, 0, 2, 8, -1, 4, 3};
IntVector vec = IntVector.fromArray(int256Species, arr, 0);
IntVector vec2 = vec.mul(vec);
int[] arr2 = new int[8];
vec2.intoArray(arr2, 0);
System.out.println("x\tx²");
System.out.println("-------------------");
for (int i=0; i<8; i++)
System.out.println(arr[i] + "\t" + arr2[i]);
}
}
我用于编译和运行程序的命令是:
dev/build/linux-x86_64-server-release/jdk/bin/javac --add-modules=jdk.incubator.vector,java.base --patch-module java.base=src/ --add-reads java.base=jdk.incubator.vector src/Panama.java
dev/build/linux-x86_64-server-release/jdk/bin/java --add-modules=jdk.incubator.vector -cp src/ Panama
接下来,我想将代码合并到BigInteger.java
JDK 附带的源代码中。我只是将 import 语句和 main 方法添加到BigInteger.java
. 我编译了代码:
dev/build/linux-x86_64-server-release/jdk/bin/javac --add-reads java.base=jdk.incubator.vector --patch-module java.base=src/ --add-modules=jdk.incubator.vector src/java/math/BigInteger.java
当我尝试使用
dev/build/linux-x86_64-server-release/jdk/bin/java --add-reads java.base=jdk.incubator.vector --patch-module java.base=src/ --add-modules=jdk.incubator.vector --add-exports jdk.incubator.vector/jdk.incubator.vector=java.base -cp src/ java.math.BigInteger
我收到以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: jdk/incubator/vector/Vector$Shape
at java.base/java.math.BigInteger.main(BigInteger.java:4837)
第 4837 行是以IntSpecies int256Species = ....
所以看起来 java.base 模块无法访问该jdk.incubator.vector
模块。请注意,这jdk.incubator.vector
是巴拿马 JDK 的一部分。
我的问题是,即使我允许使用 and 选项,为什么我会java.base
收到jdk.incubator.vector
此--add-exports
错误--add-reads
?我需要给它另一个选项,以便我可以使用jdk.incubator.vector
类BigInteger
吗?
编辑:添加hg checkout
和hg branch
编辑^2:巴拿马 API 自从我两周前克隆回购以来发生了变化。代码已更新,因此可以再次编译。