RFR: 8264109: Add vectorized implementation for VectorMask.andNot()

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

RFR: 8264109: Add vectorized implementation for VectorMask.andNot()

Xiaohong Gong
Currently "VectorMask.andNot()" is not vectorized:
    public VectorMask<E> andNot(VectorMask<E> m) {
        // FIXME: Generate good code here.
        return bOp(m, (i, a, b) -> a && !b);
    }
This can be implemented with` "and(m.not())" `directly. Since `"VectorMask.and()/not()" `have been vectorized in hotspot, `"andNot"`
can be vectorized as well by calling them.

The performance gain is >100% for such a simple JMH:
  @Benchmark
  public Object andNot(Blackhole bh) {
    boolean[] mask = fm.apply(SPECIES.length());
    boolean[] r = fmt.apply(SPECIES.length());
    VectorMask<Byte> rm = VectorMask.fromArray(SPECIES, r, 0);

    for (int ic = 0; ic < INVOC_COUNT; ic++) {
      for (int i = 0; i < mask.length; i += SPECIES.length()) {
        VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, i);
          rm = rm.andNot(vmask);
        }
    }
    return rm;
  }

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

Commit messages:
 - 8264109: Add vectorized implementation for VectorMask.andNot()

Changes: https://git.openjdk.java.net/jdk/pull/3211/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=3211&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8264109
  Stats: 11 lines in 2 files changed: 2 ins; 6 del; 3 mod
  Patch: https://git.openjdk.java.net/jdk/pull/3211.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/3211/head:pull/3211

PR: https://git.openjdk.java.net/jdk/pull/3211
Reply | Threaded
Open this post in threaded view
|

Re: RFR: 8264109: Add vectorized implementation for VectorMask.andNot()

Xiaohong Gong
On Fri, 26 Mar 2021 01:50:33 GMT, Xiaohong Gong <[hidden email]> wrote:

> Currently "VectorMask.andNot()" is not vectorized:
>     public VectorMask<E> andNot(VectorMask<E> m) {
>         // FIXME: Generate good code here.
>         return bOp(m, (i, a, b) -> a && !b);
>     }
> This can be implemented with` "and(m.not())" `directly. Since `"VectorMask.and()/not()" `have been vectorized in hotspot, `"andNot"`
> can be vectorized as well by calling them.
>
> The performance gain is >100% for such a simple JMH:
>   @Benchmark
>   public Object andNot(Blackhole bh) {
>     boolean[] mask = fm.apply(SPECIES.length());
>     boolean[] r = fmt.apply(SPECIES.length());
>     VectorMask<Byte> rm = VectorMask.fromArray(SPECIES, r, 0);
>
>     for (int ic = 0; ic < INVOC_COUNT; ic++) {
>       for (int i = 0; i < mask.length; i += SPECIES.length()) {
>         VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, i);
>           rm = rm.andNot(vmask);
>         }
>     }
>     return rm;
>   }

Hi there, could anyone please take a look at this PR? Thanks so much!

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

PR: https://git.openjdk.java.net/jdk/pull/3211
Reply | Threaded
Open this post in threaded view
|

Re: RFR: 8264109: Add vectorized implementation for VectorMask.andNot() [v2]

Xiaohong Gong
In reply to this post by Xiaohong Gong
> Currently "VectorMask.andNot()" is not vectorized:
>     public VectorMask<E> andNot(VectorMask<E> m) {
>         // FIXME: Generate good code here.
>         return bOp(m, (i, a, b) -> a && !b);
>     }
> This can be implemented with` "and(m.not())" `directly. Since `"VectorMask.and()/not()" `have been vectorized in hotspot, `"andNot"`
> can be vectorized as well by calling them.
>
> The performance gain is >100% for such a simple JMH:
>   @Benchmark
>   public Object andNot(Blackhole bh) {
>     boolean[] mask = fm.apply(SPECIES.length());
>     boolean[] r = fmt.apply(SPECIES.length());
>     VectorMask<Byte> rm = VectorMask.fromArray(SPECIES, r, 0);
>
>     for (int ic = 0; ic < INVOC_COUNT; ic++) {
>       for (int i = 0; i < mask.length; i += SPECIES.length()) {
>         VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, i);
>           rm = rm.andNot(vmask);
>         }
>     }
>     return rm;
>   }

Xiaohong Gong has updated the pull request incrementally with one additional commit since the last revision:

  Move the changing to AbstractMask.andNot and revert changes in VectorMask
 
  Change-Id: Ie3ec8f53cb24526c8e1ccc68038355d024910818
  CustomizedGitHooks: yes

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

Changes:
  - all: https://git.openjdk.java.net/jdk/pull/3211/files
  - new: https://git.openjdk.java.net/jdk/pull/3211/files/ccb73d92..33ac041e

Webrevs:
 - full: https://webrevs.openjdk.java.net/?repo=jdk&pr=3211&range=01
 - incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=3211&range=00-01

  Stats: 9 lines in 2 files changed: 5 ins; 2 del; 2 mod
  Patch: https://git.openjdk.java.net/jdk/pull/3211.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/3211/head:pull/3211

PR: https://git.openjdk.java.net/jdk/pull/3211
Reply | Threaded
Open this post in threaded view
|

Re: RFR: 8264109: Add vectorized implementation for VectorMask.andNot() [v2]

Paul Sandoz-2
On Thu, 1 Apr 2021 03:39:43 GMT, Xiaohong Gong <[hidden email]> wrote:

>> Currently "VectorMask.andNot()" is not vectorized:
>>     public VectorMask<E> andNot(VectorMask<E> m) {
>>         // FIXME: Generate good code here.
>>         return bOp(m, (i, a, b) -> a && !b);
>>     }
>> This can be implemented with` "and(m.not())" `directly. Since `"VectorMask.and()/not()" `have been vectorized in hotspot, `"andNot"`
>> can be vectorized as well by calling them.
>>
>> The performance gain is >100% for such a simple JMH:
>>   @Benchmark
>>   public Object andNot(Blackhole bh) {
>>     boolean[] mask = fm.apply(SPECIES.length());
>>     boolean[] r = fmt.apply(SPECIES.length());
>>     VectorMask<Byte> rm = VectorMask.fromArray(SPECIES, r, 0);
>>
>>     for (int ic = 0; ic < INVOC_COUNT; ic++) {
>>       for (int i = 0; i < mask.length; i += SPECIES.length()) {
>>         VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, i);
>>           rm = rm.andNot(vmask);
>>         }
>>     }
>>     return rm;
>>   }
>
> Xiaohong Gong has updated the pull request incrementally with one additional commit since the last revision:
>
>   Move the changing to AbstractMask.andNot and revert changes in VectorMask
>  
>   Change-Id: Ie3ec8f53cb24526c8e1ccc68038355d024910818
>   CustomizedGitHooks: yes

Looks good.

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

Marked as reviewed by psandoz (Reviewer).

PR: https://git.openjdk.java.net/jdk/pull/3211
Reply | Threaded
Open this post in threaded view
|

Re: RFR: 8264109: Add vectorized implementation for VectorMask.andNot() [v2]

Xiaohong Gong
On Thu, 1 Apr 2021 15:13:31 GMT, Paul Sandoz <[hidden email]> wrote:

>> Xiaohong Gong has updated the pull request incrementally with one additional commit since the last revision:
>>
>>   Move the changing to AbstractMask.andNot and revert changes in VectorMask
>>  
>>   Change-Id: Ie3ec8f53cb24526c8e1ccc68038355d024910818
>>   CustomizedGitHooks: yes
>
> Looks good.

Thanks for your review @PaulSandoz !

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

PR: https://git.openjdk.java.net/jdk/pull/3211
Reply | Threaded
Open this post in threaded view
|

Re: RFR: 8264109: Add vectorized implementation for VectorMask.andNot() [v2]

Ningsheng Jian-2
In reply to this post by Xiaohong Gong
On Thu, 1 Apr 2021 03:39:43 GMT, Xiaohong Gong <[hidden email]> wrote:

>> Currently "VectorMask.andNot()" is not vectorized:
>>     public VectorMask<E> andNot(VectorMask<E> m) {
>>         // FIXME: Generate good code here.
>>         return bOp(m, (i, a, b) -> a && !b);
>>     }
>> This can be implemented with` "and(m.not())" `directly. Since `"VectorMask.and()/not()" `have been vectorized in hotspot, `"andNot"`
>> can be vectorized as well by calling them.
>>
>> The performance gain is >100% for such a simple JMH:
>>   @Benchmark
>>   public Object andNot(Blackhole bh) {
>>     boolean[] mask = fm.apply(SPECIES.length());
>>     boolean[] r = fmt.apply(SPECIES.length());
>>     VectorMask<Byte> rm = VectorMask.fromArray(SPECIES, r, 0);
>>
>>     for (int ic = 0; ic < INVOC_COUNT; ic++) {
>>       for (int i = 0; i < mask.length; i += SPECIES.length()) {
>>         VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, i);
>>           rm = rm.andNot(vmask);
>>         }
>>     }
>>     return rm;
>>   }
>
> Xiaohong Gong has updated the pull request incrementally with one additional commit since the last revision:
>
>   Move the changing to AbstractMask.andNot and revert changes in VectorMask
>  
>   Change-Id: Ie3ec8f53cb24526c8e1ccc68038355d024910818
>   CustomizedGitHooks: yes

LGTM

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

Marked as reviewed by njian (Committer).

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