Skip to content

Vector mapping

Simon Moll edited this page Sep 21, 2018 · 1 revision

(This is a work in progress.)

A Vector Mapping associates a scalar function (scalarFn) with a vector function (vectorFn) along with constraints under which RV may use the vector function to vectorize calls to the scalar function. The vector mapping also encodes the result Vector Shape of the function.

Vector function predicate parameter

If maskPos >= 0 then the vector function has an additional vector predicate parameter at position maskPos. In that case the vector mask parameter must have <W x i1> type and is implicitly assumed to be varying.

Constraints

Argument Shapes

The argShapes encode the Vector Shape of each vector function parameter. The vector function will only be used if each the vector function parameter is compatible with the shape of the passed-in value at the call site. E.g. this disqualifies a vector mapping if the passed-in value has a varying shape but the argShape for that argument is consecutive.

Interaction of arg shapes with the vector function predicate.

Note that argShapes is indexed by the scalar parameter index. If maskPos <= 0 that means that a scalar parameter at position i maps to the vector function parameter at position i. However, if the vector function has a predicate parameter then the vector parameter index for all following parameters are shifted by one, that is the scalar parameter at position i is mapped to vector function parameter i+1 for i >= maskPos and maskPos >= 0.

CallPredicateMode

The call predicate mode of a vector mapping encodes whether and how a function call can be vectorized in a predicated context. As such the call predicate mode restricts the applicability of the vector function. RV currently supports three CallPredicateModes. Note that all of these modes are compatible with predicated vector functions (maskPos >= 0).

  • Unpredicated The vector function does not support predication at all. The function will only be vectorized if RV can guarantee that the predicate is all-true (ie. that the block predicate is uniform). This should be the safe default for vector functions of which there is no knowledge of their behavior and that do not have a predicate argument.

  • PredicateArg The vector function has a mandatory mask parameter. This should be the default if a predicata parameter exists (e.g. those resulting from the "inbranch" clause in OpenMP 4.x).

  • SafeWithoutPredicate It is safe to use this vector function in all call contexts, regardless of the predicate. This should be used for functions that can safely run with lanes initialized to undef even though the vector function internally assumes that all vector lanes are active.