openjdk.ruOpenJDK на русском

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.