RFR: 8281294: [vectorapi] FIRST_NONZERO reduction operation throws IllegalArgumentExcept on zero vectors
John R Rose
jrose at openjdk.java.net
Wed Feb 9 22:50:07 UTC 2022
On Wed, 9 Feb 2022 21:36:01 GMT, Paul Sandoz <psandoz at openjdk.org> wrote:
> …ArgumentExcept on zero vectors
>
> This PR fixes issues for reduction using FIRST_NONZERO and adds tests. The testing infrastructure is generalized to reduction functions and tests for min/max reductions are updated to use that.
Wow good catch.
A single vector operation is almost never a whole algorithmic step, but rather a part of a larger one, across an array, for which the vector is a "window" viewing part of the the array, either VLEN elements, or (in the case of masking) a lesser number.
Put another way, doing a task on VLENGTH>2 elements should always be refactorable as a pair of similar tasks on a pair of shorter VLENGTH/2 vectors and vice versa.
Put yet another way, vector operations should support grouping and ungrouping transformations.
In the case of reductions, a longer reduction of the form `R[op](a,b…,c,d…)` should always decompose into shorter ones, as `R[op](a,b…) op R[op](c,d…)`, and vice versa. Suppose VLENGTH=8; a reduction over a 13-element array should always be vectorizable as an 8-way reduction followed by a masked reduction of the remainder, followed by a scalar reduction. That goes for `FIRST_NONZERO` as well as (most) other ops. (Some ops like float add are only approximately associative.)
You can consider this a public service announcement reminding us why throwing on an edge condition from a vector operation is probably always wrong.
-------------
PR: https://git.openjdk.java.net/jdk/pull/7410
More information about the core-libs-dev
mailing list