RFR: 8256523: Streamline Java SHA2 implementation

Aleksey Shipilev shade at openjdk.java.net
Fri Nov 20 06:49:02 UTC 2020


On Fri, 20 Nov 2020 00:14:55 GMT, Valerie Peng <valeriep 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
>
> Changes look good.

Thank you, @valeriepeng. I am not sure what is the review policy for this code, should I wait for another reviewer?

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

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



More information about the security-dev mailing list