Встроенные компоненты AES-NI включены по умолчанию?

Oracle имеет это сказать о Java 8 в отношении AES-NI:

встроенные аппаратные средства были добавлены для использования расширенного стандарта шифрования (AES). Флаги UseAES и UseAESIntrinsics доступны для включения аппаратные встроенные AES для аппаратного обеспечения Intel. Аппаратура должно быть 2010 или более новое оборудование Westmere. Например, чтобы включить аппаратные средства AES, используйте следующие флаги:

-XX:+UseAES -XX:+UseAESIntrinsics

для отключения аппаратного AES используйте следующее флаги:

-XX:-UseAES -XX:-UseAESIntrinsics

но он не указывает, включены ли встроенные AES по умолчанию (для процессоров, которые его поддерживают). Поэтому вопрос прост: если процессор поддерживает AES-NI, используются ли встроенные AES?

бонусный вопрос: есть ли способ проверить, используется ли AES-NI? Я думаю, вы можете догадаться, основываясь на производительности, но это не Оптимальный или надежный способ тестирования.


для читателей которые не знакомы с внутреннеприсущими AES-NI: он заменяет байтовый код предварительно скомпилированным машинным кодом, используя набор инструкций AES-NI. Это происходит с помощью JVM, поэтому он не отображается в API среды выполнения Java или байт-кода.

2 ответов


флаг имеет значение по умолчанию true и будет установлен в false, если обнаружение не удается, так что вы можете просто использовать + PrintFlagsFinal, чтобы увидеть, если он используется:

Мой Ноутбук без AES-NI:

C:\>"C:\Program Files\Java\jdk1.7.0_51\bin\java" -XX:+PrintFlagsFinal -version | find "UseAES"
     bool UseAES                                    = false           {product}
     bool UseAESIntrinsics                          = false           {product}
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

то же самое на рабочем столе С AES-NI:

C:\>"C:\Program Files\Java\jdk7\bin\java" -XX:+PrintFlagsFinal -version | find "AES"
     bool UseAES                                    = true            {product}
     bool UseAESIntrinsics                          = true            {product}

java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

C:\>"C:\Program Files (x86)\Java\jre7\bin\java" -XX:+PrintFlagsFinal -version | find "AES"
     bool UseAES                                    = true            {product}
     bool UseAESIntrinsics                          = true            {product}

java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) Client VM (build 24.51-b03, mixed mode, sharing)

Итак, он работает как для x64, так и для i686 (WOW64) с недавней Java 7. Функция была введена сhttps://bugs.openjdk.java.net/browse/JDK-7184394 и backported к 7u40 и 7u45.


важно: AES-NI может быть доступен только на сервер VM.

Это было подтверждено Oracle после сообщение об ошибке было подано. Эта жизненно важная часть информации отсутствовала, когда они создали список featues Java 8, где он был представлен (позже он также был возвращен в 7). Сервер VM можно явно выбрать, предоставив на java или javaw командная строка.


Не могу комментировать (глупо, поэтому правила более 50 кредитов требуется!). этот почтовый поток из openjdk говорит, что все встроенные AES включены по умолчанию. Хотя я не уверен, сколько кода Oracle core VM разделяет с openjdk. Если Вы читаете весь поток, они также обсуждают проблемы на 32-разрядных виртуальных машинах, что, вероятно, объясняет вашу проблему со вторым тестовым запуском.

  • Что касается вашего теста (извините, не могу прокомментировать), не думаете ли вы, что различия в процессоры имеют большое значение? Core i7 - это quadcore и имеют лучшую тактовую частоту в целом. Разве это не имело бы значения ? Я предполагаю, что переход от 21s (core i5, 32bitVM, AES-NI off) к 8s (core i7, 64bitVM, AES-NI off) - это разница между i5 и i7.
  • улучшение от 8s до 3s, хотя и не 7 раз, действительно стоит "Yipes"! :)
  • Что касается механизма обнаружения - кажется, нет простого способа. JVM выдает предупреждение " AES встроенные компоненты недоступны на этом процессоре " если вы включили флаги, и если он не может найти поддержку AES -согласно этому отчету об ошибке.