JEP 315: Improve Aarch64 Intrinsics
Улучшение intrinsic-функций для AArch64
| Ответственный | Dmitrij Pochepko |
| Тип | Feature |
| Область | Implementation |
| Статус | Closed / Delivered |
| Выпуск | 11 |
| Компонент | hotspot / compiler |
| Обсуждение | hotspot dash compiler dash dev at openjdk dot java dot net |
| Трудоёмкость | L |
| Длительность | L |
| Рецензенты | Mikael Vidstedt, Vladimir Kozlov |
| Одобрен | Vladimir Kozlov |
| Создан | 2017/10/10 12:40 |
| Обновлён | 2023/05/03 08:21 |
| Задача | 8189104 |
Аннотация
Улучшить существующие intrinsic-функции для строк и массивов и реализовать новые intrinsic-функции для функций sin, cos и log из java.lang.Math на процессорах AArch64.
Что не является целью
- Сравняться по производительности с другими архитектурами
- Настраивать intrinsic-функции общего порта AArch64 на оптимальную производительность только для одной реализации архитектуры ARM64
- Переносить intrinsic-функции в порт для процессоров ARM
Мотивация
Специализированные шаблоны кода под конкретную архитектуру процессора повышают производительность пользовательских приложений и бенчмарков.
Описание
Intrinsic-функции позволяют использовать ассемблерный код под конкретную архитектуру процессора. Для повышения производительности этот код выполняется вместо обычного Java-кода данного метода. Большинство intrinsic-функций в порте AArch64 уже реализовано, но оптимизированных intrinsic-функций для следующих методов java.lang.Math пока нет:
- sin (тригонометрическая функция синуса)
- cos (тригонометрическая функция косинуса)
- log (логарифм числа)
Этот JEP призван восполнить этот пробел: в нём будут реализованы оптимизированные intrinsic-функции для этих методов.
Кроме того, хотя большинство intrinsic-функций в порте AArch64 уже реализовано, текущая реализация некоторых из них может быть неоптимальной. В частности, некоторым intrinsic-функциям для архитектур AArch64 могут пойти на пользу инструкции программной предвыборки, выравнивание адресов памяти, размещение инструкций с учётом многоконвейерных процессоров и замена некоторых шаблонов инструкций более быстрыми или SIMD-инструкциями.
Сюда входят (но не только) такие типичные операции, как String::compareTo, String::indexOf, StringCoding::hasNegatives, Arrays::equals, StringUTF16::compress, StringLatin1::inflate, а также различные вычисления контрольных сумм.
В зависимости от алгоритма intrinsic-функции, самого распространённого сценария её использования и особенностей процессора могут рассматриваться следующие изменения:
- Использовать набор инструкций ARM NEON. Такой код (если он будет написан) будет включаться флагом (например,
UseSIMDForMemoryOps), если у существующего алгоритма есть версия без NEON. - Использовать инструкцию-подсказку предвыборки (PRFM). Эффект этой инструкции зависит от разных факторов: наличия и возможностей аппаратного блока предвыборки в процессоре, соотношения частот процессора и памяти, особенностей контроллера памяти и потребностей конкретного алгоритма.
- Переупорядочивать инструкции и сокращать зависимости по данным, чтобы по возможности разрешить внеочередное выполнение.
- При необходимости избегать невыровненного доступа к памяти. Некоторые реализации процессоров вносят задержки при выполнении инструкций загрузки/сохранения через границу 16 байт или границу строки кэша данных (dcache) либо имеют разное оптимальное выравнивание для разных инструкций загрузки/сохранения (см., например, руководство по Cortex A53). Если выровненные версии intrinsic-функций не замедляют выполнение кода на процессорах, не зависящих от выравнивания, может оказаться полезным улучшить выравнивание адресов, чтобы помочь процессорам, у которых такие задержки есть, при условии что это не слишком усложнит код.
Тестирование
- Производительность intrinsic-функций будет проверяться на оборудовании Cavium ThunderX, ThunderX2 и Cortex A53 с помощью бенчмарков JMH.
- Функциональная корректность будет проверяться набором тестов
jtreg. Если существующая тестовая база не даёт достаточного покрытия, могут быть написаны дополнительные тесты.
Риски и допущения
- Мы постараемся реализовать общие версии intrinsic-функций AArch64 с оптимальной производительностью. Там, где это невозможно, может понадобиться написать специализированные версии intrinsic-функций для конкретного производителя оборудования.
- Провести тестирование и замеры производительности на всех вариантах оборудования AArch64 невозможно. Тестирование на оборудовании, которого у нас сейчас нет, мы оставим сообществу OpenJDK: его участники смогут провести его, если сочтут необходимым, когда патчи будут отправлены на рецензирование.
- Intrinsic-функции, которые затрагивает этот JEP, привязаны к архитектуре процессора, поэтому их изменение не влияет на общий код HotSpot.