[vulkan] Add VK_SUBGROUP_FEATURE_ARITHMETIC_BIT support
As the name suggest, this CL adds many operations related
to arithmetic subgroup operations, i.e.:
- Reduction / Inclusive Scan / Exclusive Scans for:
- IntAdd, UIntAdd, FloatAdd
- IntMul, UIntMul, FloatMul,
- IntMin, UIntMin, FloatMin,
- IntMax, UIntMax, FloatMax,
- BitwiseAnd, BitwiseOr, BitwiseXor
- LogicalAnd, LogicalOr, LogicalXor
The implementation uses a single template function to
implement all these, based on the fact that these are
all binary commutative operations.
NOTE: Only 32-bit values are supported.
To make scans efficient, a new Reactor operation, named
Blend() is introduced. It is used to mix two input vectors
using 4 3-bit indices (encoded in a single 16-bit value)
to select the result's lane values.
A new unit-test is added to ReactorUnittests to check its
behaviour. Unfortunately, the test takes about 2 minutes
on a fast workstation when doing a full scan, so it will
by default only check 1/11th of all possible values
(see comments in the patch for more details).
Also, Float4::positive_inf() and Float4::negative_inf()
methods were added, since trying to build Float4(INFINITY)
will trigger a DCHECK() in the Float4(float) constructor,
and the infinity values are required by the subgroup
floating-point scan operations.
Bug: b/142002682
Test: dEQP-VK.subgroups.arithmetic.*
Change-Id: I86f509fc47f7475ca126615ed698ee493ae835ef
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/38929Reviewed-by:
Chris Forbes <chrisforbes@google.com>
Reviewed-by:
Ben Clayton <bclayton@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by:
David Turner <digit@google.com>
Showing
Please
register
or
sign in
to comment