Почему Java SIMD (Панама) медленнее, чем скаляр? - PullRequest
0 голосов
/ 07 июня 2018

Я следовал руководству Intel для SIMD на Java с Панама .Я хочу сделать несколько простых операций над массивами:

Вот скалярный и векторный цикл с сайта:

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;
    }
}

Когда я измеряю время:

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);

Я всегда получаю более высокое время для вектора, чем скаляр.У тебя есть идея почему?Спасибо.

1 Ответ

0 голосов
/ 19 июля 2018

Вы используете не ту ветвь: сборка из ветки vectorIntrinsics .Вам также нужно использовать JMH для получения правильных измерений - здесь - это некоторые сторонние тесты, написанные для Vector API.

Разница между API-интерфейсом Vector и вычислением точечного произведения приведена в здесь .

...