K.V*_*.Vu 5 java performance simd project-panama
我在巴拿马遵循了 Java 中 SIMD 的英特尔教程 。我想对数组做一些简单的操作:
这里是网站的标量和向量循环:
public static void scalarComputation(float[] a, float[] b, float[] c) {
for (int i = 0; i < a.length; i++) {
c[i] = (a[i] * a[i] + b[i] * b[i]) * - 1.0f;
}
}
public static void vectorComputation(float[] a, float[] b, float[] c) {
int i = 0;
for (; i < (a.length & ~(species.length() - 1));
i += species.length()) {
FloatVector<Shapes.S256Bit> va = speciesFloat.fromArray(a, i);
FloatVector<Shapes.S256Bit> vb = speciesFloat.fromArray(b, i);
FloatVector<Shapes.S256Bit> vc = va.mul(va).
add(vb.mul(vb)).
neg();
vc.intoArray(c, i);
}
for (; i < a.length; i++) {
c[i] = (a[i] * a[i] + b[i] * b[i]) * -1.0f;
}
}
Run Code Online (Sandbox Code Playgroud)
当我测量时间时:
float [] A = new float[N];
float [] B = new float[N];
float [] C = new float[N];
for(int i = 0; i < C.length; i++)
{
C[i] = 2.0f;
A[i] = 2.0f;
B[i] = 2.0f;
}
long start = System.nanoTime();
for(int i = 0; i < 200; i++)
{
//scalarComputation(C,A,B);
//vectorComputation(C,A,B);
}
long end = System.nanoTime();
System.out.println(end - start);
Run Code Online (Sandbox Code Playgroud)
我总是得到比标量更高的向量时间。你知道为什么吗?谢谢你。
小智 6
您使用了错误的分支:从vectorIntrinsics 分支构建。您还需要使用 JMH 来获得正确的测量结果——这里有一些为 Vector API 编写的第三方基准测试。
有关 Vector API 对点积计算的不同之处,请参阅此处。