15 #include <type_traits>
21 template <
typename T,
class BinaryOperation>
23 bool_constant<std::is_same<BinaryOperation, sycl::plus<T>>::value ||
24 std::is_same<BinaryOperation, sycl::plus<void>>::value>;
26 template <
typename T,
class BinaryOperation>
29 std::is_same<BinaryOperation, sycl::multiplies<void>>::value>;
31 template <
typename T,
class BinaryOperation>
34 std::is_same<BinaryOperation, sycl::minimum<void>>::value>;
36 template <
typename T,
class BinaryOperation>
39 std::is_same<BinaryOperation, sycl::maximum<void>>::value>;
41 template <
typename T,
class BinaryOperation>
44 std::is_same<BinaryOperation, sycl::bit_and<void>>::value>;
46 template <
typename T,
class BinaryOperation>
49 std::is_same<BinaryOperation, sycl::bit_or<void>>::value>;
51 template <
typename T,
class BinaryOperation>
54 std::is_same<BinaryOperation, sycl::bit_xor<void>>::value>;
56 template <
typename T,
class BinaryOperation>
58 std::is_same<BinaryOperation, sycl::logical_and<T>>::value ||
59 std::is_same<BinaryOperation, sycl::logical_and<void>>::value>;
61 template <
typename T,
class BinaryOperation>
64 std::is_same<BinaryOperation, sycl::logical_or<void>>::value>;
67 template <
typename T,
class BinaryOperation>
76 template <
typename T,
class BinaryOperation>
82 template <
typename T,
class BinaryOperation>
87 template <
typename T,
class BinaryOperation>
93 template <
typename T,
class BinaryOperation>
99 template <
typename T,
class BinaryOperation>
103 template <
typename T,
class BinaryOperation>
106 template <
typename T,
class BinaryOperation>
116 template <
typename BinaryOperation,
typename AccumulatorT>
118 : std::integral_constant<
119 bool, IsKnownIdentityOp<AccumulatorT, BinaryOperation>::value> {};
121 template <
typename BinaryOperation,
typename AccumulatorT,
typename =
void>
125 template <
typename BinaryOperation,
typename AccumulatorT>
127 BinaryOperation, AccumulatorT,
128 std::
enable_if_t<IsZeroIdentityOp<AccumulatorT, BinaryOperation>::value>> {
129 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(0);
132 #if __cplusplus >= 201703L && (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
133 template <
typename BinaryOperation,
int NumElements>
137 BinaryOperation>::value>> {
142 template <
typename BinaryOperation,
int NumElements>
146 BinaryOperation>::value>> {
152 template <
typename BinaryOperation,
int NumElements>
156 BinaryOperation>::value>> {
161 template <
typename BinaryOperation>
163 BinaryOperation,
half,
164 std::
enable_if_t<IsZeroIdentityOp<half, BinaryOperation>::value>> {
166 #ifdef __SYCL_DEVICE_ONLY__
174 template <
typename BinaryOperation,
typename AccumulatorT>
176 BinaryOperation, AccumulatorT,
177 std::
enable_if_t<IsOneIdentityOp<AccumulatorT, BinaryOperation>::value>> {
178 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(1);
181 #if __cplusplus >= 201703L && (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
182 template <
typename BinaryOperation,
int NumElements>
186 IsOneIdentityOp<vec<std::byte, NumElements>, BinaryOperation>::value>> {
191 template <
typename BinaryOperation,
int NumElements>
195 BinaryOperation>::value>> {
201 template <
typename BinaryOperation>
203 BinaryOperation,
half,
204 std::
enable_if_t<IsOneIdentityOp<half, BinaryOperation>::value>> {
206 #ifdef __SYCL_DEVICE_ONLY__
214 template <
typename BinaryOperation,
typename AccumulatorT>
216 BinaryOperation, AccumulatorT,
217 std::
enable_if_t<IsOnesIdentityOp<AccumulatorT, BinaryOperation>::value>> {
218 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(-1LL);
221 #if __cplusplus >= 201703L && (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
222 template <
typename BinaryOperation,
int NumElements>
226 BinaryOperation>::value>> {
231 template <
typename BinaryOperation,
int NumElements>
235 BinaryOperation>::value>> {
242 template <
typename BinaryOperation,
typename AccumulatorT>
245 AccumulatorT, BinaryOperation>::value>> {
246 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(
247 std::numeric_limits<AccumulatorT>::has_infinity
248 ? std::numeric_limits<AccumulatorT>::infinity()
249 : (
std::numeric_limits<AccumulatorT>::
max)());
252 #if __cplusplus >= 201703L && (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
253 template <
typename BinaryOperation,
int NumElements>
257 BinaryOperation>::value>> {
260 std::numeric_limits<vec<std::byte, NumElements>>::has_infinity
261 ? std::numeric_limits<vec<std::byte, NumElements>>::infinity()
262 : (std::numeric_limits<vec<std::byte, NumElements>>::max)());
265 template <
typename BinaryOperation,
int NumElements>
269 BinaryOperation>::value>> {
272 std::numeric_limits<marray<std::byte, NumElements>>::has_infinity
273 ? std::numeric_limits<marray<std::byte, NumElements>>::infinity()
279 template <
typename BinaryOperation,
typename AccumulatorT>
282 AccumulatorT, BinaryOperation>::value>> {
283 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(
284 std::numeric_limits<AccumulatorT>::has_infinity
285 ?
static_cast<AccumulatorT
>(
286 -std::numeric_limits<AccumulatorT>::infinity())
287 : std::numeric_limits<AccumulatorT>::lowest());
290 #if __cplusplus >= 201703L && (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
291 template <
typename BinaryOperation,
int NumElements>
295 BinaryOperation>::value>> {
298 std::numeric_limits<vec<std::byte, NumElements>>::has_infinity
300 -std::numeric_limits<vec<std::byte, NumElements>>::infinity())
304 template <
typename BinaryOperation,
int NumElements>
308 BinaryOperation>::value>> {
311 std::numeric_limits<marray<std::byte, NumElements>>::has_infinity
313 -std::numeric_limits<
320 template <
typename BinaryOperation,
typename AccumulatorT>
322 BinaryOperation, AccumulatorT,
323 std::
enable_if_t<IsFalseIdentityOp<AccumulatorT, BinaryOperation>::value>> {
324 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(
false);
327 #if __cplusplus >= 201703L && (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
328 template <
typename BinaryOperation,
int NumElements>
332 BinaryOperation>::value>> {
337 template <
typename BinaryOperation,
size_t NumElements>
341 BinaryOperation>::value>> {
348 template <
typename BinaryOperation,
typename AccumulatorT>
350 BinaryOperation, AccumulatorT,
351 std::
enable_if_t<IsTrueIdentityOp<AccumulatorT, BinaryOperation>::value>> {
352 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(
true);
355 #if __cplusplus >= 201703L && (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
356 template <
typename BinaryOperation,
int NumElements>
360 BinaryOperation>::value>> {
365 template <
typename BinaryOperation,
int NumElements>
369 BinaryOperation>::value>> {
378 template <
typename BinaryOperation,
typename AccumulatorT>
381 std::decay_t<AccumulatorT>> {};
383 template <
typename BinaryOperation,
typename AccumulatorT>
388 template <
typename BinaryOperation,
typename AccumulatorT>
391 std::decay_t<AccumulatorT>> {};
393 template <
typename BinaryOperation,
typename AccumulatorT>