Подтвердить что ты не робот

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

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

Аппаратные свойства были добавлены для использования Advanced Encryption Standard (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 или байт-кода.

4b9b3361

Ответ 1

Флаг имеет значение по умолчанию 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 и передана в 7u40 и 7u45.


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

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

Ответ 2

Не могу комментировать (глупые правила SO требуют более 50 кредитов!). Этот mailthread из openjdk говорит, что все встроенные функции AES включены по умолчанию. Хотя я не уверен, что часть основного кода Oracle Oracle разделяет openjdk. Если вы читаете весь поток, они также обсуждают проблемы с 32-разрядными виртуальными машинами, что, вероятно, объясняет вашу проблему во втором тестовом прогоне.

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