Java 的矢量运算就是使用单个指令并行处理多个数据的一个尝试(单指令多数据,Single Instruction Multiple Data)。
为了使用单指令多数据的指令,我们需要把不同数据的运算独立出来,让并行运算成为可能。而数学里的矢量运算,恰好就能满足这样的要求。
fromArray 这个方法,可以把一个数组变量,转换成一个矢量的变量。
static final float[] a = new float[] {0.6F, 0.7F, 0.8F, 0.9F};
static final FloatVector va =
FloatVector.fromArray(FloatVector.SPECIES_128, a, 0);
static final float[] x = new float[] {1.0F, 2.0F, 3.0F, 4.0F};
static final FloatVector vx =
FloatVector.fromArray(FloatVector.SPECIES_128, x, 0);
private static Returned<Float> sumInVector(FloatVector va, FloatVector vx) {
if (va == null || vx == null || va.length() != vx.length()) {
return new Returned.ErrorCode(-1);
}
// FloatVector vy = va.mul(vx);
float[] y = va.mul(vx).toArray();
float r = 0F;
for (int i = 0; i < y.length; i++) {
r += y[i];
}
return new Returned.ReturnValue<>(r);
}
在密码学和机器学习领域,通常需要处理几百甚至几千维的数据。一般情况下,为了能够使用处理器的计算优势,我们经常需要特殊的设计以及内嵌于 JVM 的本地代码来获得硬件加速。这样的限制,让普通代码的计算很难获得硬件加速的好处。
希望成熟后的 Java 矢量运算,能在这些领域有出色的表现,让普通的代码获得处理器的单指令多数据的强大运算能力。毕竟,只有单指令多数据的优势能够被普通的 Java 应用程序广泛使用,Java 才能在机器学习、科学计算这些领域获得计算优势。
此文章为9月Day13学习笔记,内容来源于极客时间《深入剖析 Java 新特性》