2014-04-14 12 views
30

Oracle ma do powiedzenia na temat Java 8 w odniesieniu do AES-NI: intrinsicsWewnętrzne elementy AES-NI są domyślnie włączone?

sprzętowe zostały dodane do korzystania Advanced Encryption Standard (AES). Flagi UseAES i UseAESIntrinsics są dostępne, aby umożliwić sprzętową integrację AES dla sprzętu Intela. Sprzęt musi być 2010 lub nowszym sprzętem Westmere. Na przykład, aby umożliwić AES sprzętowych, należy użyć następujących znaczników:

-XX:+UseAES -XX:+UseAESIntrinsics 

Aby wyłączyć AES sprzętowe użyć następujących znaczników:

-XX:-UseAES -XX:-UseAESIntrinsics 

Ale to nie wskazują, czy intrinsics AES są włączone domyślny (dla procesorów, które go obsługują). Pytanie jest więc proste: czy procesor obsługuje AES-NI, czy używane są elementy wewnętrzne AES?

Pytanie dodatkowe: czy istnieje sposób sprawdzenia, czy używane jest AES-NI? Domyślam się, że możesz zgadnąć na podstawie wyników, ale nie jest to optymalny lub pewny sposób testowania ogniowego.


dla czytelników, które nie są zaznajomieni z intrinsics AES-NI: To zastępujących kod bajtowy z pre-kompilowane kodu maszynowego, stosując zestaw instrukcji AES-NI. Dzieje się tak przez maszynę JVM, więc nie pojawia się w interfejsie API środowiska wykonawczego Java ani kodu bajtowego.

Odpowiedz

31

Flaga ma domyślną prawdą i zostanie ustawiona na false, jeśli się nie uda, więc może po prostu użyć + PrintFlagsFinal aby sprawdzić, czy jest on używany:

moim laptopie bez 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) 

samo na pulpicie z 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) 

Działa więc zarówno dla x64, jak i i686 (WOW64) z najnowszą Javą 7. Funkcja została wprowadzona z https://bugs.openjdk.java.net/browse/JDK-7184394 i przeniesiona do 7u40 i 7u45.


Ważne: AES-NI mogą być dostępne tylko na serwerze VM.

Zostało to potwierdzone przez Oracle po a bug report was filed. Ta istotna informacja zniknęła, gdy utworzono listę elementów Java 8, w której została ona wprowadzona (później została przeniesiona również do wersji 7). Maszynę wirtualną serwera można jawnie wybrać, podając opcję -server na linii poleceń java lub javaw.

4

Nie mogę komentować (głupie reguły SO wymagają więcej niż 50 kredytów!). This mailthread from openjdk mówi, że wszystkie wewnętrzne elementy AES są domyślnie włączone. Chociaż nie jestem pewien, ile kodu rdzenia VM Oracle ma udział z openjdk. Jeśli czytasz cały wątek, omawiają także wyzwania na 32-bitowych maszynach wirtualnych, które prawdopodobnie wyjaśniają twój problem z drugim testem.

  • Odnośnie testu (przepraszam, nie mogę komentować), nie sądzisz, że różnice w procesorach robią wielką różnicę? Core i7 są quadcore i mają ogólnie lepsze prędkości zegara. Czy to nie miało znaczenia? Domyślam się, że przesunięcie z 21s (core i5, 32bitVM, AES-NI off) do 8s (core i7, 64bitVM, AES-NI off) jest różnicą między i5 i i7.
  • Poprawa z 8s na 3s, choć nie 7-krotnie, jest naprawdę warta "Yipes"! :)
  • Jeśli chodzi o mechanizm wykrywania - nie wydaje się, aby był to prosty sposób. JVM generuje ostrzeżenie "Ains intrinsics nie są dostępne na tym CPU", jeśli włączone flagi, a jeśli nie może znaleźć wsparcia AES - as per this bug report.
+0

AES CBC ma charakter ściśle liniowy, więc wiele rdzeni nie ma znaczenia (i oczywiście uruchamiam z włączonym harmonogramem zadań lub top). Ponadto na i5 wyraźnie widzę, że nie ma różnicy w odniesieniu do wydajności, włączonej lub wyłączonej. Na koniec wydaje się, że stare sprawdzenie dodatkowych instrukcji dotyczących procesora zostało naprawione w raporcie o błędzie. Nie widzę niczego rozstrzygającego, aby zobaczyć, dlaczego starszy procesor nie jest obsługiwany. Z 7-krotnym wzrostem: była to Java 8 działająca na 32-bitowym i nowszym i7-bitowym i5. Wciąż ogromny wzrost dla bajtów tej samej klasy :) –

+0

Aha i i7 wydawało się, że wykonuje około 2x prędkość i5 dla zwykłych aplikacji (testowałem specjalnie kompilację C++), która jest znacznie szybsza, ale nie 7-krotna luka przez długa droga. Zauważ, że 64-bitowe zoptymalizowane aplikacje mogą uzyskać * dodatkowe * przyspieszenie. Te nowsze procesory robią różnicę, jak sądzę. –

+0

OK. Ma sens. W moich własnych testach flagi AES nie wydają się być honorowane. Bez względu na to, czy włączam, czy wyłączam flagi, czasy wykonania są takie same. Tak więc, jeśli potrzebujemy rzeczywistej różnicy wprowadzonej przez obsługę CPU, możemy potrzebować identycznych procesorów - jednego z wyłączonym AES-NI i innego włączonego. Jeden facet ma tutaj interesujące wyniki (nie java), a jądro wyłącza AES-NI: https://ask.fedoraproject.org/en/question/29298/how-can-i-verify-that-my-luks-will -utilize-aes-ni-encryption-support-in-my-system/ Jego wyniki są bardzo bliskie twojemu (7x w wielu przypadkach) – user30622

Powiązane problemy