RFR: 8256523: Streamline Java SHA2 implementation

Valerie Peng valeriep at openjdk.java.net
Wed Nov 18 20:03:00 UTC 2020


On Wed, 18 Nov 2020 08:29:49 GMT, Aleksey Shipilev <shade at openjdk.org> wrote:

> Current `sun/security/provider/SHA2` implementation is written with lots of small method invocations on the fastpath in `implCompress0`. Normally it does not matter much, because compilers are able to inline through it, and then some compilers even intrinsify the entire `implCompress0`.
> 
> But it comes as major downside for platforms that do not have SHA2 intrinsics, or those VM configs that blindly interpret the bytecode. Zero, for example, keeps re-entering the small methods when computing SHA2 digests during jmod/jlink generation during the build, and spends significant time there. Linux x86_64 Zero fastdebug builds **improve from 18.5 minutes to 11.0 minutes** with this change, which is a major win for development experience.
> 
> Note that SHA1 is already written in similar streamlined style. SHA5 is written with helper functions. This patch moves SHA2 to be closer to SHA1 style-wise.
> 
> Performance improvement in interpreted modes is substantial, about 4x..5x, while compiler modes are not affected. As measured by: `make test TEST="micro:MessageDigests" MICRO="FORK=1;ITER=5;WARMUP_ITER=5;WARMUP_TIME=1s;TIME=1s;OPTIONS=-p digesterName=sha256 -p provider=SUN"`
> 
> Before:
> 
> Benchmark              (digesterName)  (length)  (provider)   Mode  Cnt     Score   Error    Units
> 
> # Server, Default
> MessageDigests.digest          sha256        64         SUN  thrpt    5  8585.532 ± 219.896  ops/ms
> MessageDigests.digest          sha256      1024         SUN  thrpt    5  1545.994 ±  73.325  ops/ms
> MessageDigests.digest          sha256     16384         SUN  thrpt    5   110.550 ±   1.576  ops/ms
> 
> # Server, -XX:+UnlockDiagnosticVMOptions -XX:-UseSHA256Intrinsics
> MessageDigests.digest          sha256        64         SUN  thrpt    5  1426.117 ±  48.320  ops/ms
> MessageDigests.digest          sha256      1024         SUN  thrpt    5   188.779 ±   0.097  ops/ms
> MessageDigests.digest          sha256     16384         SUN  thrpt    5    12.512 ±   1.371  ops/ms
> 
> # Server, -Xint
> MessageDigests.digest          sha256        64         SUN  thrpt    5     6.143 ±   0.126  ops/ms
> MessageDigests.digest          sha256      1024         SUN  thrpt    5     0.769 ±   0.008  ops/ms
> MessageDigests.digest          sha256     16384         SUN  thrpt    5     0.051 ±   0.001  ops/ms
> 
> # Zero
> MessageDigests.digest          sha256        64         SUN  thrpt    5     5.358 ±   0.664  ops/ms
> MessageDigests.digest          sha256      1024         SUN  thrpt    5     0.686 ±   0.003  ops/ms
> MessageDigests.digest          sha256     16384         SUN  thrpt    5     0.046 ±   0.001  ops/ms
> 
> After:
> 
> Benchmark              (digesterName)  (length)  (provider)   Mode  Cnt     Score   Error     Units
> 
> # Server, Default
> MessageDigests.digest          sha256        64         SUN  thrpt    5  8564.689 ± 1459.552  ops/ms
> MessageDigests.digest          sha256      1024         SUN  thrpt    5  1548.582 ±   78.888  ops/ms
> MessageDigests.digest          sha256     16384         SUN  thrpt    5   110.800 ±    0.057  ops/ms
> 
> # Server, -XX:+UnlockDiagnosticVMOptions -XX:-UseSHA256Intrinsics
> MessageDigests.digest          sha256        64         SUN  thrpt    5  1471.399 ±   66.622  ops/ms
> MessageDigests.digest          sha256      1024         SUN  thrpt    5   186.297 ±    0.127  ops/ms
> MessageDigests.digest          sha256     16384         SUN  thrpt    5    12.448 ±    0.099  ops/ms
> 
> # Server, -Xint
> MessageDigests.digest          sha256        64         SUN  thrpt    5    27.046 ±    0.304  ops/ms
> MessageDigests.digest          sha256      1024         SUN  thrpt    5     3.538 ±    0.060  ops/ms
> MessageDigests.digest          sha256     16384         SUN  thrpt    5     0.238 ±    0.002  ops/ms
> 
> # Zero
> MessageDigests.digest          sha256        64         SUN  thrpt    5    26.696 ±    0.968  ops/ms
> MessageDigests.digest          sha256      1024         SUN  thrpt    5     3.655 ±    0.024  ops/ms
> MessageDigests.digest          sha256     16384         SUN  thrpt    5     0.241 ±    0.002  ops/ms
> 
> Addtional testing:
>  - [x] `jdk/security` with Linux x86_64 server fastdebug
>  - [x] `jdk/security` with Linux x86_64 zero fastdebug

Sounds impressive, I will take a look. Thanks!

-------------

PR: https://git.openjdk.java.net/jdk/pull/1283



More information about the security-dev mailing list