Измерение производительности Java Vector API при его использовании в операциях над векторными представлениями.
Аппаратные векторные инструкции широко используются для повышения производительности вычислений. Java Vector API, представленный в Java 16, позволяет переносимо использовать их на любой платформе, поддерживаемой виртуальной машиной Java. В данной работе выполняется оценка производительности при реализации типичных операций поиска по векторным представлениям, таких как вычисление расстояния между двумя векторными представлениями, с использованием Java Vector API. Производительность векторизованных реализаций этих операций сравнивается с семантически эквивалентным скалярным кодом. Кроме того, производится сравнение Java Vector API с нативными реализациями на C++, вызываемыми из Java-кода через различные интерфейсы взаимодействия Java с нативным кодом, а именно Java JNI, Project Panama (Foreign Function and Memory API) и управление JIT-компилятором через JVM CI и библиотеку Nalim. Результаты тестирования показывают, что в определенных ситуациях использование Vector API может привести к заметному увеличению производительности низкоуровневых операций, что может выражаться в ускорении высокоуровневых алгоритмов, таких как Product Quantization. Однако в некоторых сценариях использование Vector API оказывается медленнее по сравнению с автоматической векторизацией, предоставляемой JVM, и большинство тестов показывают, что вызов вычислений, реализованных на C++, занимает меньше времени по сравнению с Vector API, даже с учетом всех накладных расходов, возникающих при вызовах нативного кода. Используя методы для снижения этих накладных расходов, например, избегая операций копирования памяти, можно уменьшить время выполнения в пять раз по сравнению с Vector API и в десять раз по сравнению с обычным Java-кодом. Тем не менее, в случаях, когда использование нативного кода запрещено, Vector API все еще может демонстрировать заметное повышение производительности, что может быть полезно для вычислений, связанных с векторными представлениями, в Java-приложениях.