RFR(S) JDK-8205528: Base64 Encode Algorithm using AVX512 Instructions

Kamath, Smita smita.kamath at intel.com
Fri Jun 22 21:49:56 UTC 2018


Hi Vladimir,

Please see my answers to your questions as below:

1) One question so: why you have own copy of base64 charsets and not using one in library:
I am using vpgatherdd instruction to fetch multiple values from base64 array in a single instruction with a vector index. Vpgatherdd instruction works on 32 bit array and so I need to define base64 charset in a 32 bit array. I have given reference to gather instruction below.

2) Some indents in new and old Assembler::emit_operand() are off. In new Assembler::emit_operand() is better use } else { instead of 'return' in one branch.
I'll make the necessary changes and send an updated webrev.

3) This is first time I see that XMM register can be used for index in address. Is it true? Can you point to Intel's document which describes it.
I am using vpgatherdd instruction which requires index vector with scale. It uses VSIB addressing where the index register is a zmm register. 
Please refer to reference manual, volume 2c, page 2211: https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf
Also see, section 2.3.12, page 524 for VSIB memory addressing information.

4)  Please, add tests to test/hotspot/jtreg/compiler/intrinsics/base64 (may be similar to sha or AES in compiler/codegen/aes) to make sure that all flags, intrinsic is used and it produces correct result.
I will add test cases as per your suggestion.

Please let me know if you have additional questions.

Thanks,
Smita

-----Original Message-----
From: Vladimir Kozlov [mailto:vladimir.kozlov at oracle.com] 
Sent: Friday, June 22, 2018 12:29 PM
To: Kamath, Smita <smita.kamath at intel.com>
Cc: hotspot compiler <hotspot-compiler-dev at openjdk.java.net>
Subject: Re: RFR(S) JDK-8205528: Base64 Encode Algorithm using AVX512 Instructions

Hi Smita,

I CCing to Libs to review code changes in Base64.java.

Looks like you changed all need place to implement intrinsic.
One question so: why you have own copy of base64 charsets and not using one in library:

          private int encode0(byte[] src, int off, int end, byte[] dst) {
              char[] base64 = isURL ? toBase64URL : toBase64;

Some indents in new and old Assembler::emit_operand() are off.

In new Assembler::emit_operand() is better use } else { instead of 'return' in one branch.

This is first time I see that XMM register can be used for index in address. Is it true? Can you point to Intel's document which describes it.

What testing you did?

Please, add tests to test/hotspot/jtreg/compiler/intrinsics/base64 (may be similar to sha or AES in compiler/codegen/aes) to make sure that all flags, intrinsic is used and it produces correct result.

I know there is test/jdk/java/util/Base64/ tests but they may not trigger intrinsic usage. But you can use them as starting point for new tests.

Thanks,
Vladimir

On 6/22/18 11:47 AM, Kamath, Smita wrote:
> Hi Vladimir,
> 
> I'd like to contribute an optimization for Base64 Encoding Algorithm 
> using AVX512 Instructions. This optimization shows 1.5x improvement on
> x86_64 platform(SKL).
> 
> Link to Bug: https://bugs.openjdk.java.net/browse/JDK-8205528
> 
> Link to webrev: 
> http://cr.openjdk.java.net/~vdeshpande/Base64/webrev.00/
> 
> For testing the implementation, I have run tests under 
> test/jdk/java/util/Base64/ and also ran 
> test/jdk/com/sun/jndi/ldap/Base64Test.java
> 
> I have also run jtreg.
> 
> Please review and let me know if you have any comments.
> 
> Thanks and Regards,
> 
> Smita
> 


More information about the core-libs-dev mailing list