22 #include <type_traits>
25 inline namespace _V1 {
28 template <
typename T,
class BinaryOperation>
30 std::bool_constant<std::is_same_v<BinaryOperation, sycl::plus<T>> ||
31 std::is_same_v<BinaryOperation, sycl::plus<void>>>;
33 template <
typename T,
class BinaryOperation>
35 std::bool_constant<std::is_same_v<BinaryOperation, sycl::multiplies<T>> ||
36 std::is_same_v<BinaryOperation, sycl::multiplies<void>>>;
38 template <
typename T,
class BinaryOperation>
40 std::bool_constant<std::is_same_v<BinaryOperation, sycl::minimum<T>> ||
41 std::is_same_v<BinaryOperation, sycl::minimum<void>>>;
43 template <
typename T,
class BinaryOperation>
45 std::bool_constant<std::is_same_v<BinaryOperation, sycl::maximum<T>> ||
46 std::is_same_v<BinaryOperation, sycl::maximum<void>>>;
48 template <
typename T,
class BinaryOperation>
50 std::bool_constant<std::is_same_v<BinaryOperation, sycl::bit_and<T>> ||
51 std::is_same_v<BinaryOperation, sycl::bit_and<void>>>;
53 template <
typename T,
class BinaryOperation>
55 std::bool_constant<std::is_same_v<BinaryOperation, sycl::bit_or<T>> ||
56 std::is_same_v<BinaryOperation, sycl::bit_or<void>>>;
58 template <
typename T,
class BinaryOperation>
60 std::bool_constant<std::is_same_v<BinaryOperation, sycl::bit_xor<T>> ||
61 std::is_same_v<BinaryOperation, sycl::bit_xor<void>>>;
63 template <
typename T,
class BinaryOperation>
65 std::is_same_v<BinaryOperation, std::logical_and<T>> ||
66 std::is_same_v<BinaryOperation, std::logical_and<void>> ||
67 std::is_same_v<BinaryOperation, sycl::logical_and<T>> ||
68 std::is_same_v<BinaryOperation, sycl::logical_and<void>>>;
70 template <
typename T,
class BinaryOperation>
72 std::bool_constant<std::is_same_v<BinaryOperation, std::logical_or<T>> ||
73 std::is_same_v<BinaryOperation, std::logical_or<void>> ||
74 std::is_same_v<BinaryOperation, sycl::logical_or<T>> ||
75 std::is_same_v<BinaryOperation, sycl::logical_or<void>>>;
80 template <
typename T,
typename =
void>
84 template <
typename T,
class BinaryOperation>
94 template <
typename T,
class BinaryOperation>
96 is_genbool_v<T> || is_geninteger_v<T> ||
100 template <
typename T,
class BinaryOperation>
106 template <
typename T,
class BinaryOperation>
108 is_genbool_v<T> || is_geninteger_v<T> ||
112 template <
typename T,
class BinaryOperation>
114 is_genbool_v<T> || is_geninteger_v<T> ||
118 template <
typename T,
class BinaryOperation>
120 std::bool_constant<IsLogicalOR<T, BinaryOperation>::value>;
123 template <
typename T,
class BinaryOperation>
125 std::bool_constant<IsLogicalAND<T, BinaryOperation>::value>;
127 template <
typename T,
class BinaryOperation>
129 std::bool_constant<IsZeroIdentityOp<T, BinaryOperation>::value ||
137 template <
typename BinaryOperation,
typename AccumulatorT>
139 : std::integral_constant<
140 bool, IsKnownIdentityOp<AccumulatorT, BinaryOperation>::value> {};
142 template <
typename BinaryOperation,
typename AccumulatorT,
typename =
void>
146 template <
typename BinaryOperation,
typename AccumulatorT>
148 BinaryOperation, AccumulatorT,
149 std::enable_if_t<IsZeroIdentityOp<AccumulatorT, BinaryOperation>::value>> {
150 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(0);
153 #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
154 template <
typename BinaryOperation,
int NumElements>
157 std::enable_if_t<IsZeroIdentityOp<vec<std::byte, NumElements>,
158 BinaryOperation>::value>> {
163 template <
typename BinaryOperation,
int NumElements>
166 std::enable_if_t<IsZeroIdentityOp<marray<std::byte, NumElements>,
167 BinaryOperation>::value>> {
173 template <
typename BinaryOperation,
int NumElements>
176 std::enable_if_t<IsZeroIdentityOp<vec<sycl::half, NumElements>,
177 BinaryOperation>::value>> {
182 template <
typename BinaryOperation>
184 BinaryOperation,
half,
185 std::enable_if_t<IsZeroIdentityOp<half, BinaryOperation>::value>> {
187 #ifdef __SYCL_DEVICE_ONLY__
195 template <
typename BinaryOperation,
typename AccumulatorT>
197 BinaryOperation, AccumulatorT,
198 std::enable_if_t<IsOneIdentityOp<AccumulatorT, BinaryOperation>::value>> {
199 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(1);
202 #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
203 template <
typename BinaryOperation,
int NumElements>
207 IsOneIdentityOp<vec<std::byte, NumElements>, BinaryOperation>::value>> {
212 template <
typename BinaryOperation,
int NumElements>
215 std::enable_if_t<IsOneIdentityOp<marray<std::byte, NumElements>,
216 BinaryOperation>::value>> {
222 template <
typename BinaryOperation>
224 BinaryOperation,
half,
225 std::enable_if_t<IsOneIdentityOp<half, BinaryOperation>::value>> {
227 #ifdef __SYCL_DEVICE_ONLY__
235 template <
typename BinaryOperation,
typename AccumulatorT>
237 BinaryOperation, AccumulatorT,
238 std::enable_if_t<IsOnesIdentityOp<AccumulatorT, BinaryOperation>::value>> {
239 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(-1LL);
242 #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
243 template <
typename BinaryOperation,
int NumElements>
246 std::enable_if_t<IsOnesIdentityOp<vec<std::byte, NumElements>,
247 BinaryOperation>::value>> {
252 template <
typename BinaryOperation,
int NumElements>
255 std::enable_if_t<IsOnesIdentityOp<marray<std::byte, NumElements>,
256 BinaryOperation>::value>> {
263 template <
typename BinaryOperation,
typename AccumulatorT>
265 std::enable_if_t<IsMinimumIdentityOp<
266 AccumulatorT, BinaryOperation>::value>> {
267 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(
268 std::numeric_limits<AccumulatorT>::has_infinity
269 ? std::numeric_limits<AccumulatorT>::infinity()
270 : (
std::numeric_limits<AccumulatorT>::
max)());
273 #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
274 template <
typename BinaryOperation,
int NumElements>
277 std::enable_if_t<IsMinimumIdentityOp<vec<std::byte, NumElements>,
278 BinaryOperation>::value>> {
281 std::numeric_limits<vec<std::byte, NumElements>>::has_infinity
282 ? std::numeric_limits<vec<std::byte, NumElements>>::infinity()
286 template <
typename BinaryOperation,
int NumElements>
289 std::enable_if_t<IsMinimumIdentityOp<marray<std::byte, NumElements>,
290 BinaryOperation>::value>> {
293 std::numeric_limits<marray<std::byte, NumElements>>::has_infinity
294 ? std::numeric_limits<marray<std::byte, NumElements>>::infinity()
300 template <
typename BinaryOperation,
typename AccumulatorT>
302 std::enable_if_t<IsMaximumIdentityOp<
303 AccumulatorT, BinaryOperation>::value>> {
304 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(
305 std::numeric_limits<AccumulatorT>::has_infinity
306 ?
static_cast<AccumulatorT
>(
307 -std::numeric_limits<AccumulatorT>::infinity())
308 : std::numeric_limits<AccumulatorT>::lowest());
311 #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
312 template <
typename BinaryOperation,
int NumElements>
315 std::enable_if_t<IsMaximumIdentityOp<vec<std::byte, NumElements>,
316 BinaryOperation>::value>> {
319 std::numeric_limits<vec<std::byte, NumElements>>::has_infinity
321 -std::numeric_limits<vec<std::byte, NumElements>>::infinity())
325 template <
typename BinaryOperation,
int NumElements>
328 std::enable_if_t<IsMaximumIdentityOp<marray<std::byte, NumElements>,
329 BinaryOperation>::value>> {
332 std::numeric_limits<marray<std::byte, NumElements>>::has_infinity
334 -std::numeric_limits<
341 template <
typename BinaryOperation,
typename AccumulatorT>
343 BinaryOperation, AccumulatorT,
344 std::enable_if_t<IsFalseIdentityOp<AccumulatorT, BinaryOperation>::value>> {
345 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(
false);
348 #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
349 template <
typename BinaryOperation,
int NumElements>
352 std::enable_if_t<IsFalseIdentityOp<vec<std::byte, NumElements>,
353 BinaryOperation>::value>> {
358 template <
typename BinaryOperation,
size_t NumElements>
361 std::enable_if_t<IsFalseIdentityOp<marray<std::byte, NumElements>,
362 BinaryOperation>::value>> {
369 template <
typename BinaryOperation,
typename AccumulatorT>
371 BinaryOperation, AccumulatorT,
372 std::enable_if_t<IsTrueIdentityOp<AccumulatorT, BinaryOperation>::value>> {
373 static constexpr AccumulatorT value =
static_cast<AccumulatorT
>(
true);
376 #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
377 template <
typename BinaryOperation,
int NumElements>
380 std::enable_if_t<IsTrueIdentityOp<vec<std::byte, NumElements>,
381 BinaryOperation>::value>> {
386 template <
typename BinaryOperation,
int NumElements>
389 std::enable_if_t<IsTrueIdentityOp<marray<std::byte, NumElements>,
390 BinaryOperation>::value>> {
399 template <
typename BinaryOperation,
typename AccumulatorT>
402 std::decay_t<AccumulatorT>> {};
404 template <
typename BinaryOperation,
typename AccumulatorT>
409 template <
typename BinaryOperation,
typename AccumulatorT>
412 std::decay_t<AccumulatorT>> {};
414 template <
typename BinaryOperation,
typename AccumulatorT>
Provides a cross-platform math array class template that works on SYCL devices as well as in host C++...
class sycl::vec ///////////////////////// Provides a cross-patform vector class template that works e...
std::bool_constant< IsLogicalOR< T, BinaryOperation >::value > IsFalseIdentityOp
std::bool_constant< IsLogicalAND< T, BinaryOperation >::value > IsTrueIdentityOp
std::bool_constant< std::is_same_v< BinaryOperation, sycl::maximum< T > >||std::is_same_v< BinaryOperation, sycl::maximum< void > >> IsMaximum
std::bool_constant< std::is_same_v< BinaryOperation, sycl::bit_or< T > >||std::is_same_v< BinaryOperation, sycl::bit_or< void > >> IsBitOR
std::bool_constant< IsZeroIdentityOp< T, BinaryOperation >::value||IsOneIdentityOp< T, BinaryOperation >::value||IsOnesIdentityOp< T, BinaryOperation >::value||IsMinimumIdentityOp< T, BinaryOperation >::value||IsMaximumIdentityOp< T, BinaryOperation >::value||IsFalseIdentityOp< T, BinaryOperation >::value||IsTrueIdentityOp< T, BinaryOperation >::value > IsKnownIdentityOp
std::bool_constant<(is_genbool_v< T >||is_geninteger_v< T >||is_genfloat_v< T >)&&IsMaximum< T, BinaryOperation >::value > IsMaximumIdentityOp
std::bool_constant< std::is_same_v< BinaryOperation, sycl::multiplies< T > >||std::is_same_v< BinaryOperation, sycl::multiplies< void > >> IsMultiplies
std::bool_constant< std::is_same_v< BinaryOperation, std::logical_or< T > >||std::is_same_v< BinaryOperation, std::logical_or< void > >||std::is_same_v< BinaryOperation, sycl::logical_or< T > >||std::is_same_v< BinaryOperation, sycl::logical_or< void > >> IsLogicalOR
std::bool_constant< std::is_same_v< BinaryOperation, std::logical_and< T > >||std::is_same_v< BinaryOperation, std::logical_and< void > >||std::is_same_v< BinaryOperation, sycl::logical_and< T > >||std::is_same_v< BinaryOperation, sycl::logical_and< void > >> IsLogicalAND
std::bool_constant<((is_genbool_v< T >||is_geninteger_v< T >)&&(IsPlus< T, BinaryOperation >::value||IsBitOR< T, BinaryOperation >::value||IsBitXOR< T, BinaryOperation >::value))||(is_genfloat_v< T > &&IsPlus< T, BinaryOperation >::value)||(isComplex< T >::value &&IsPlus< T, BinaryOperation >::value)> IsZeroIdentityOp
std::bool_constant<(is_genbool_v< T >||is_geninteger_v< T >||is_genfloat_v< T >)&&IsMultiplies< T, BinaryOperation >::value > IsOneIdentityOp
std::bool_constant<(is_genbool_v< T >||is_geninteger_v< T >||is_genfloat_v< T >)&&IsMinimum< T, BinaryOperation >::value > IsMinimumIdentityOp
std::bool_constant< std::is_same_v< BinaryOperation, sycl::plus< T > >||std::is_same_v< BinaryOperation, sycl::plus< void > >> IsPlus
std::bool_constant< std::is_same_v< BinaryOperation, sycl::minimum< T > >||std::is_same_v< BinaryOperation, sycl::minimum< void > >> IsMinimum
std::bool_constant< std::is_same_v< BinaryOperation, sycl::bit_and< T > >||std::is_same_v< BinaryOperation, sycl::bit_and< void > >> IsBitAND
std::bool_constant< std::is_same_v< BinaryOperation, sycl::bit_xor< T > >||std::is_same_v< BinaryOperation, sycl::bit_xor< void > >> IsBitXOR
std::bool_constant<(is_genbool_v< T >||is_geninteger_v< T >)&&IsBitAND< T, BinaryOperation >::value > IsOnesIdentityOp
constexpr bool has_known_identity_v
constexpr AccumulatorT known_identity_v
sycl::detail::half_impl::half half