java cryptography aes cpu jvm-hotspot

java - Intrínsecos AES-NI habilitados por defecto?



cryptography cpu (2)

Oracle tiene esto que decir acerca de Java 8 con respecto a AES-NI:

Se agregaron intrínsecos de hardware para usar el Estándar de cifrado avanzado (AES). Los indicadores UseAES y UseAESIntrinsics están disponibles para habilitar los intrínsecos AES basados ​​en hardware para hardware Intel. El hardware debe ser 2010 o un hardware Westmere más nuevo. Por ejemplo, para habilitar el hardware AES, use los siguientes indicadores:

-XX:+UseAES -XX:+UseAESIntrinsics

Para deshabilitar el hardware AES, use los siguientes indicadores:

-XX:-UseAES -XX:-UseAESIntrinsics

Pero no indica si los intrínsecos de AES están habilitados por defecto (para los procesadores que lo soportan). Entonces la pregunta es simple: si el procesador es compatible con AES-NI, ¿se utilizan los intrínsecos de AES?

Pregunta extra: ¿hay alguna manera de probar si se está utilizando AES-NI? Supongo que puedes adivinar en función del rendimiento, pero esa no es una forma óptima o segura de probar.

Para los lectores que no están familiarizados con los intrínsecos de AES-NI: está reemplazando el código de bytes con código de máquina precompilado, usando el conjunto de instrucciones AES-NI. Esto ocurre con JVM, por lo que no aparece en la API del tiempo de ejecución o bytecode de Java.


La bandera tiene un valor predeterminado de verdadero y se establecerá en falso si la detección falla, por lo que simplemente puede usar + PrintFlagsFinal para ver si se usa:

Mi computadora portátil sin 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)

Lo mismo en el escritorio con 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)

Por lo tanto, funciona tanto para x64 como para i686 (WOW64) con Java 7. La característica se introdujo con https://bugs.openjdk.java.net/browse/JDK-7184394 y se transfirió a 7u40 y 7u45.

Importante: AES-NI solo puede estar disponible en la VM del servidor .

Esto fue reconocido por Oracle después de que se presentó un informe de error . Esta pieza vital de información faltaba cuando crearon la lista de características de Java 8 donde se introdujo (más tarde también se copió a 7). La máquina virtual del servidor se puede elegir explícitamente al proporcionar la opción -server en la línea de comandos java o javaw .


No puedo comentar (estúpidas reglas SO ¡se requieren más de 50 créditos!). Este hilo de correo de openjdk dice que todos los intrínsecos de AES están habilitados por defecto. Aunque no estoy seguro de cuánto comparte el código de la máquina central de Oracle con openjdk. Si lees todo el hilo, también discuten sobre los desafíos en las máquinas virtuales de 32 bits, lo que probablemente explique tu problema con tu segunda ejecución de prueba.

  • Con respecto a su prueba (lo siento, no puedo comentar), ¿no cree que las diferencias en las CPU hacen una gran diferencia? Los Core i7 son quadcore y tienen mejores velocidades de reloj en general. ¿No habría hecho eso una diferencia? Supongo que ese cambio de 21s (Core i5, 32bitVM, AES-NI off) a 8s (Core i7, 64bitVM, AES-NI off) es la diferencia entre i5 e i7.
  • ¡La mejora de 8s a 3s, aunque no 7 veces, vale la pena un ''Yipes''! :)
  • En cuanto al mecanismo de detección, no parece haber una manera directa. JVM lanza una advertencia "AES intrínsecos no disponibles en esta CPU" si activó las banderas y si no puede encontrar compatibilidad con AES, según este informe de errores .