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>;
68 std::is_same<T, std::complex<double>>::value>;
71 template <
typename T,
class BinaryOperation>
80 template <
typename T,
class BinaryOperation>
87 template <
typename T,
class BinaryOperation>
93 template <
typename T,
class BinaryOperation>
100 template <
typename T,
class BinaryOperation>
107 template <
typename T,
class BinaryOperation>
111 template <
typename T,
class BinaryOperation>
114 template <
typename T,
class BinaryOperation>
124 template <
typename BinaryOperation,
typename AccumulatorT>
126 : std::integral_constant<
127 bool, IsKnownIdentityOp<AccumulatorT, BinaryOperation>::value> {};
129 template <
typename BinaryOperation,
typename AccumulatorT,
typename =
void>
133 template <
typename BinaryOperation,
typename AccumulatorT>
135 BinaryOperation, AccumulatorT,
136 std::
enable_if_t<IsZeroIdentityOp<AccumulatorT, BinaryOperation>::value>> {
137 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(0);
140 #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
141 template <
typename BinaryOperation,
int NumElements>
145 BinaryOperation>::value>> {
150 template <
typename BinaryOperation,
int NumElements>
154 BinaryOperation>::value>> {
160 template <
typename BinaryOperation,
int NumElements>
164 BinaryOperation>::value>> {
169 template <
typename BinaryOperation>
171 BinaryOperation,
half,
172 std::
enable_if_t<IsZeroIdentityOp<half, BinaryOperation>::value>> {
174 #ifdef __SYCL_DEVICE_ONLY__
182 template <
typename BinaryOperation,
typename AccumulatorT>
184 BinaryOperation, AccumulatorT,
185 std::
enable_if_t<IsOneIdentityOp<AccumulatorT, BinaryOperation>::value>> {
186 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(1);
189 #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
190 template <
typename BinaryOperation,
int NumElements>
194 IsOneIdentityOp<vec<std::byte, NumElements>, BinaryOperation>::value>> {
199 template <
typename BinaryOperation,
int NumElements>
203 BinaryOperation>::value>> {
209 template <
typename BinaryOperation>
211 BinaryOperation,
half,
212 std::
enable_if_t<IsOneIdentityOp<half, BinaryOperation>::value>> {
214 #ifdef __SYCL_DEVICE_ONLY__
222 template <
typename BinaryOperation,
typename AccumulatorT>
224 BinaryOperation, AccumulatorT,
225 std::
enable_if_t<IsOnesIdentityOp<AccumulatorT, BinaryOperation>::value>> {
226 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(-1LL);
229 #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
230 template <
typename BinaryOperation,
int NumElements>
234 BinaryOperation>::value>> {
239 template <
typename BinaryOperation,
int NumElements>
243 BinaryOperation>::value>> {
250 template <
typename BinaryOperation,
typename AccumulatorT>
253 AccumulatorT, BinaryOperation>::value>> {
254 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(
255 std::numeric_limits<AccumulatorT>::has_infinity
256 ? std::numeric_limits<AccumulatorT>::infinity()
257 : (
std::numeric_limits<AccumulatorT>::
max)());
260 #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
261 template <
typename BinaryOperation,
int NumElements>
265 BinaryOperation>::value>> {
268 std::numeric_limits<vec<std::byte, NumElements>>::has_infinity
269 ? std::numeric_limits<vec<std::byte, NumElements>>::infinity()
273 template <
typename BinaryOperation,
int NumElements>
277 BinaryOperation>::value>> {
280 std::numeric_limits<marray<std::byte, NumElements>>::has_infinity
281 ? std::numeric_limits<marray<std::byte, NumElements>>::infinity()
287 template <
typename BinaryOperation,
typename AccumulatorT>
290 AccumulatorT, BinaryOperation>::value>> {
291 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(
292 std::numeric_limits<AccumulatorT>::has_infinity
293 ?
static_cast<AccumulatorT
>(
294 -std::numeric_limits<AccumulatorT>::infinity())
295 : std::numeric_limits<AccumulatorT>::lowest());
298 #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
299 template <
typename BinaryOperation,
int NumElements>
303 BinaryOperation>::value>> {
306 std::numeric_limits<vec<std::byte, NumElements>>::has_infinity
308 -std::numeric_limits<vec<std::byte, NumElements>>::infinity())
312 template <
typename BinaryOperation,
int NumElements>
316 BinaryOperation>::value>> {
319 std::numeric_limits<marray<std::byte, NumElements>>::has_infinity
321 -std::numeric_limits<
328 template <
typename BinaryOperation,
typename AccumulatorT>
330 BinaryOperation, AccumulatorT,
331 std::
enable_if_t<IsFalseIdentityOp<AccumulatorT, BinaryOperation>::value>> {
332 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(
false);
335 #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
336 template <
typename BinaryOperation,
int NumElements>
340 BinaryOperation>::value>> {
345 template <
typename BinaryOperation,
size_t NumElements>
349 BinaryOperation>::value>> {
356 template <
typename BinaryOperation,
typename AccumulatorT>
358 BinaryOperation, AccumulatorT,
359 std::
enable_if_t<IsTrueIdentityOp<AccumulatorT, BinaryOperation>::value>> {
360 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(
true);
363 #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
364 template <
typename BinaryOperation,
int NumElements>
368 BinaryOperation>::value>> {
373 template <
typename BinaryOperation,
int NumElements>
377 BinaryOperation>::value>> {
386 template <
typename BinaryOperation,
typename AccumulatorT>
389 std::decay_t<AccumulatorT>> {};
391 template <
typename BinaryOperation,
typename AccumulatorT>
393 sycl::has_known_identity<BinaryOperation, AccumulatorT>::value;
396 template <
typename BinaryOperation,
typename AccumulatorT>
399 std::decay_t<AccumulatorT>> {};
401 template <
typename BinaryOperation,
typename AccumulatorT>
403 sycl::known_identity<BinaryOperation, AccumulatorT>::value;