<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style></head><body lang=DE link=blue vlink="#954F72"><div class=WordSection1><p class=MsoNormal>Hello,</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>and to partially answer myself: the UnlockDiagnostics is needed for Java 9+ </p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Gruss</p><p class=MsoNormal>Bernd</p><p class=MsoNormal>-- <br>http://bernd.eckenfels.net</p><p class=MsoNormal><o:p> </o:p></p><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b>Von: </b><a href="mailto:anthony.scarpino@oracle.com">Anthony Scarpino</a><br><b>Gesendet: </b>Montag, 3. Dezember 2018 21:37<br><b>An: </b><a href="mailto:ecki@zusammenkunft.net">Bernd Eckenfels</a>; <a href="mailto:security-dev@openjdk.java.net">security-dev@openjdk.java.net</a><br><b>Betreff: </b>Re: AES ctr benchmark performance<o:p></o:p></p></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Very slow..  Roughly 181k ops/sec vs 6100 ops/sec, for 16k datasize.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>As far as why there is a switch, mostly debugging or possible bugs in <o:p></o:p></p><p class=MsoNormal>hotspot that cause the intrinsic to break.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Tony<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>On 12/3/18 12:27 PM, Bernd Eckenfels wrote:<o:p></o:p></p><p class=MsoNormal>> Quick Question, why did you Need to switch it on and out of curiosity <o:p></o:p></p><p class=MsoNormal>> how do the times look like when you switch NI off?<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> Greetings<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> Bernd<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> -- <o:p></o:p></p><p class=MsoNormal>> http://bernd.eckenfels.net<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> *Von: *Anthony Scarpino <mailto:anthony.scarpino@oracle.com><o:p></o:p></p><p class=MsoNormal>> *Gesendet: *Montag, 3. Dezember 2018 21:13<o:p></o:p></p><p class=MsoNormal>> *An: *Kasper Janssens <mailto:Kasper.Janssens@wdc.com>; <o:p></o:p></p><p class=MsoNormal>> security-dev@openjdk.java.net <mailto:security-dev@openjdk.java.net><o:p></o:p></p><p class=MsoNormal>> *Betreff: *Re: AES ctr benchmark performance<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> Hi,<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> That is how I read it, but when I've done the test it's closer to 55%.<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> But openssl speed and jmh are not comparable.  Openssl is only running<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> through it's algorithm, while jmh is running through the VM and java<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> byte code. jmh has to do more work outside of pure crypto ops than openssl.<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> Tony<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>> On 12/3/18 12:09 AM, Kasper Janssens wrote:<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > Hello,<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > I've been measuring the performance of the java 11 built in AES-NI<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > instructions and, with NI switched on through JAVA_TOOL_OPTIONS =<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > ‘-XX:+UnlockDiagnosticVMOptions -XX:+UseAES -XX:+UseAESIntrinsics’.<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > I run the benchmarks that are present in the open jdk itself through<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > ‘java -server -jar target/jmh-jdk-microbenchmarks-1.0-SNAPSHOT.jar<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > org.openjdk.bench.javax.crypto.full.AESBench.encrypt -p<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > algorithm=AES/CTR/NoPadding’.<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > When I compare the results and calculate the throughput in GB/s, for 16k<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > encoding blocks, I get about 40% of the throughput when compared to the<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > openssl performance test through ‘openssl speed -evp aes-128-ctr’.<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > I don't seem to find a decent comparison/benchmark that describes which<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > percentage of the maximum performance to expect with jdk 11, but 40 %<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > seems rather low. Does anybody know of a comparison (or might have an<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > idea where I go wrong,  because, as these are off the shelf perf tools I<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > would think not a lot can be tweaked there).<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > For reference, the openssl test reports this:<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > The 'numbers' are in 1000s of bytes per second processed.<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > type             16 bytes     64 bytes    256 bytes   1024 bytes   8192<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > bytes  16384 bytes<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > aes-128-ctr     583576.76k  1907072.21k  4144141.40k  5612174.68k<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > 6252751.53k  6258371.24k<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > So, for 16k blocks, 6258371k bytes per second<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > The openjdk benchmark reports this<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > Benchmark               (algorithm)  (dataSize)  (keyLength)<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > (provider)   Mode  Cnt       Score     Error  Units<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > AESBench.encrypt  AES/CTR/NoPadding       16384<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > 128              thrpt  100  168066.873 ± 488.873  ops/s<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > Out of which I conclude that, for 16k blocks, the perf here is 168066 *<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > 16k or about 2689056k bytes per second or about 40 % of the openssl<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > number, taking some liberty with rounding the numbers.<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > Is that expected or am I drawing the wrong conclusions? Or am I missing<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > something?<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > When I print the options, the jvm reports that the AES intrinsics are<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > being used :<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > java -XX:+PrintFlagsFinal | grep -i AES<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  >       intx MaxBCEAEstimateLevel                     =<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > 5                                        {product} {default}<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  >       intx MaxBCEAEstimateSize                      =<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > 150                                      {product} {default}<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  >       bool UseAES                                   =<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > true                                     {product} {default}<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > System specs : Ubuntu 18.04<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > openjdk version "10.0.2" 2018-07-17<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > OpenJDK Runtime Environment (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > OpenJDK 64-Bit Server VM (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4, mixed<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > mode)<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  > Kasper<o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal>>  ><o:p></o:p></p><p class=MsoNormal>> <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>