Intrinseche AES-NI abilitate di default?

Oracle ha questo da dire su Java 8 per quanto riguarda AES-NI:

Le intrinsechezze hardware sono state aggiunte per utilizzare Advanced Encryption Standard (AES). I flag UseAES e UseAESIntrinsics sono disponibili per abilitare gli intrinsechi AES basati su hardware per l’hardware Intel. L’hardware deve essere il 2010 o il più recente hardware Westmere. Ad esempio, per abilitare l’hardware AES, utilizzare i seguenti flag:

-XX:+UseAES -XX:+UseAESIntrinsics 

Per disabilitare l’hardware AES utilizzare i seguenti flag:

 -XX:-UseAES -XX:-UseAESIntrinsics 

Ma non indica se gli intrinseci AES sono abilitati di default (per i processori che lo supportano). Quindi la domanda è semplice: se il processore supporta AES-NI, vengono utilizzati gli intrinseci AES?

Domanda bonus: esiste un modo per verificare se viene utilizzato AES-NI? Immagino che tu possa indovinare in base alle prestazioni, ma non è un metodo di prova ottimale o sicuro.


Per i lettori che non hanno familiarità con l’intrinseca AES-NI: sta sostituendo il codice byte con il codice macchina precompilato, usando il set di istruzioni AES-NI. Ciò accade con la JVM, quindi non viene visualizzata nell’API del runtime o del codice byte Java.

Il flag ha un valore predefinito true e sarà impostato su false se il rilevamento fallisce, quindi puoi semplicemente usare + PrintFlagsFinal per vedere se è usato:

Il mio laptop senza 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 stesso sul desktop 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) 

Quindi, funziona sia per x64 che per i686 (WOW64) con Java 7 recente. La funzionalità è stata introdotta con https://bugs.openjdk.java.net/browse/JDK-7184394 e backported a 7u40 e 7u45.


Importante: AES-NI potrebbe essere disponibile solo sulla VM del server .

Questo è stato riconosciuto da Oracle dopo che è stata presentata una segnalazione di errore . Questa informazione fondamentale mancava quando hanno creato la lista di featues di Java 8 in cui è stata introdotta (in seguito ha anche ottenuto il backport a 7). La VM del server può essere scelta in modo esplicito fornendo l’opzione -server sulla riga di comando java o javaw .

Non posso commentare (stupido SO governa più di 50 crediti richiesti!). Questo mailthread di openjdk dice che tutti gli intrinseci di AES sono abilitati di default. Anche se non sono sicuro di quanto parte del codice VM di base Oracle condivide con openjdk. Se leggi l’intero thread, discutono anche delle sfide su macchine virtuali a 32 bit, che probabilmente spiegano il tuo problema con la tua seconda esecuzione di test.

  • Per quanto riguarda il test (scusa, non posso commentare), non pensi che le differenze nelle CPU facciano una grande differenza? I Core i7 sono quadcore e hanno migliori velocità di clock in generale. Non avrebbe fatto la differenza? Immagino che il passaggio da 21s (core i5, 32bitVM, AES-NI off) a 8s (core i7, 64bitVM, AES-NI off) sia la differenza tra i5 e i7.
  • Il miglioramento da 8s a 3s, anche se non 7 volte, vale davvero un “Yipes”! 🙂
  • Per quanto riguarda il meccanismo di rilevamento – non sembra essere un modo semplice. JVM lancia un avviso “AES intrinsics non disponibile su questa CPU” se hai abilitato i flag e se non riesce a trovare il supporto AES – come da questa segnalazione di bug .