[aarch64-port-dev ] RFR(S): 8243597: AArch64: Add support for integer vector abs

Yang Zhang Yang.Zhang at arm.com
Fri Jun 5 10:35:26 UTC 2020


Hi Andrew

Please check this java program. 
http://cr.openjdk.java.net/~yzhang/8243597/TestAbs.java
absvs is used to generate AbsVS node.
Abss is used to generate AbsI node.

I update the jmh benchmarks to make them aligned with absvs and abss above. The new results are as follows:
New vector jmh: 
http://cr.openjdk.java.net/~yzhang/8243597/TestVectNew.java
New scalar jmh:
http://cr.openjdk.java.net/~yzhang/8243597/TestScalarNew.java

Before:
Benchmark               (size)  Mode  Cnt     Score   Error  Units
TestVectNew.testVectAbsVB    1024  avgt    5  1221.852 ± 3.336  us/op
TestVectNew.testVectAbsVI    1024  avgt    5  1450.422 ± 6.344  us/op
TestVectNew.testVectAbsVL    1024  avgt    5  1429.934 ± 4.901  us/op
TestVectNew.testVectAbsVS    1024  avgt    5  1227.134 ± 2.901  us/op
TestScalarNew.testAbsI    1024  avgt    5  3777.007 ± 10.067  us/op
TestScalarNew.testAbsL    1024  avgt    5  3776.717 ± 13.776  us/op
TestScalarNew.testAbsS    1024  avgt    5  3153.195 ± 10.175  us/op

After
Benchmark               (size)  Mode  Cnt    Score    Error  Units
TestVectNew.testVectAbsVB    1024  avgt    5  147.389 ±  0.921  us/op
TestVectNew.testVectAbsVI    1024  avgt    5  444.318 ± 14.107  us/op
TestVectNew.testVectAbsVL    1024  avgt    5  874.074 ±  2.224  us/op
TestVectNew.testVectAbsVS    1024  avgt    5  224.559 ±  0.902  us/op
TestScalarNew.testAbsI    1024  avgt    5  3087.172 ± 62.372  us/op
TestScalarNew.testAbsL    1024  avgt    5  3113.322 ± 10.237  us/op
TestScalarNew.testAbsS    1024  avgt    5  2723.048 ±  8.338  us/op

Why the improvement of scalar abs is not as obvious as vector abs is because only one instruction is reduced than before.
Before:
  0x0000ffff80b763d8:   cmp	w12, #0x0
  0x0000ffff80b763dc:   neg	w11, w12
  0x0000ffff80b763e0:   csel	w11, w11, w12, lt  // lt = tstop

After:
  0x0000ffffa0bd7a38:   cmp	w12, wzr
  0x0000ffffa0bd7a3c:   cneg	w13, w12, lt  // lt = tstop

Ps. The generated assembly files are also attached.
Before this patch
http://cr.openjdk.java.net/~yzhang/8243597/TestAbs.java.aarch64.ori.asm
After this patch: 
http://cr.openjdk.java.net/~yzhang/8243597/TestAbs.java.aarch64.asm

Regards
Yang

-----Original Message-----
From: Andrew Haley <aph at redhat.com> 
Sent: Friday, June 5, 2020 3:53 PM
To: Yang Zhang <Yang.Zhang at arm.com>; aarch64-port-dev at openjdk.java.net; hotspot-compiler-dev at openjdk.java.net
Cc: nd <nd at arm.com>
Subject: Re: [aarch64-port-dev ] RFR(S): 8243597: AArch64: Add support for integer vector abs

On 05/06/2020 06:52, Yang Zhang wrote:
> The test cases in TestScalar.java  are used to benchmark AbsI.

When I ask for a java program that reproduces your result, it's not unreasonable for me to expect you to send one. You still haven't, and I don't understand why your test case wasn't provided.

Can you please add a benchmark to your JMH benchmarks that actually shows the result you claimed? Thank you?

>   @Benchmark
>   public void testAbsI() {
>      for (int n = 0; n < LOOP_CNT; n++) {
>          for (int i = 0; i < ia.length; i += 4) {  ----------> That stride is *4* will make auto-vectorization fail. Only AbsI node is generated.
>              ic[i] = Math.abs(ia[i] + ib[i]);
>          }
>      }
>   }

> Or you can also use jmh vector test cases which are used to benchmark vector abs.
> http://cr.openjdk.java.net/~yzhang/8243597/TestVect.java

That is what I have been doing. They do not show the result above.

--
Andrew Haley  (he/him)
Java Platform Lead Engineer
Red Hat UK Ltd. <https://www.redhat.com> https://keybase.io/andrewhaley
EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671



More information about the aarch64-port-dev mailing list