Невозможно использовать классы jdk.incubator.vector в BigInteger

Я пытаюсь использовать Java Vector API из проекта Panama, чтобы добавить код SIMD в класс java.math.BigInteger. Я клонировал репозиторий Panama и создал 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. Я просто добавил операторы импорта и метод 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 является частью Panama JDK.

Мой вопрос: почему я получаю эту ошибку, хотя я разрешил доступ из java.base в jdk.incubator.vector с помощью параметров --add-exports и --add-reads? Есть ли другой вариант, который мне нужно указать, чтобы я мог использовать jdk.incubator.vector классы в BigInteger?

Обновлено: добавить hg checkout и hg branch

Изменить ^ 2: Панамский API изменился с тех пор, как я клонировал репо две недели назад. Код был обновлен, поэтому он снова компилируется.

SIMD обычно сложно использовать для BigInteger на уровне ассемблера. Вы не получаете перенос из упакованного сложения, а на x86, по крайней мере, у вас есть скалярное 64x64 => 128-битное умножение, но SIMD только 32x32 => 64-битное расширяющееся умножение. (Или с AVX512DQ, 64x64=>64, но это не помогает). Тем не менее, с достаточно широкими векторами, такими как AVX2, вы можете получить ускорение по сравнению со скаляром для выполнения нескольких 64x64 => 64-битных умножений по массиву, например. Самый быстрый способ умножить массив int64_t?

Peter Cordes 05.03.2019 01:27

Или вы просто пытаетесь здесь ввести SIMD-вектор в BigInteger? (Извините, я плохо знаю Java и не использовал эти библиотеки.)

Peter Cordes 05.03.2019 01:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
2
963
0

Другие вопросы по теме