Skip to content

Commit c3a4076

Browse files
[SYCL] Add support of sycl::marray to relational functions (#8427)
This patch adds support of relational functions which take mgentype as an argument as it is stated in Table 182 of SYCL 2020 specification. E2E tests: intel/llvm-test-suite#1617
1 parent 37a43f9 commit c3a4076

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

sycl/include/sycl/builtins.hpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1377,6 +1377,45 @@ detail::common_rel_ret_t<T> signbit(T x) __NOEXC {
13771377
__sycl_std::__invoke_SignBitSet<detail::internal_rel_ret_t<T>>(x));
13781378
}
13791379

1380+
// marray relational functions
1381+
1382+
#define __SYCL_MARRAY_RELATIONAL_FUNCTION_BINOP_OVERLOAD(NAME) \
1383+
template <typename T, \
1384+
typename = std::enable_if_t<detail::is_mgenfloat<T>::value>> \
1385+
sycl::marray<bool, T::size()> NAME(T x, T y) __NOEXC { \
1386+
sycl::marray<bool, T::size()> res; \
1387+
for (int i = 0; i < x.size(); i++) { \
1388+
res[i] = NAME(x[i], y[i]); \
1389+
} \
1390+
return res; \
1391+
}
1392+
1393+
#define __SYCL_MARRAY_RELATIONAL_FUNCTION_UNOP_OVERLOAD(NAME) \
1394+
template <typename T, \
1395+
typename = std::enable_if_t<detail::is_mgenfloat<T>::value>> \
1396+
sycl::marray<bool, T::size()> NAME(T x) __NOEXC { \
1397+
sycl::marray<bool, T::size()> res; \
1398+
for (int i = 0; i < x.size(); i++) { \
1399+
res[i] = NAME(x[i]); \
1400+
} \
1401+
return res; \
1402+
}
1403+
1404+
__SYCL_MARRAY_RELATIONAL_FUNCTION_BINOP_OVERLOAD(isequal)
1405+
__SYCL_MARRAY_RELATIONAL_FUNCTION_BINOP_OVERLOAD(isnotequal)
1406+
__SYCL_MARRAY_RELATIONAL_FUNCTION_BINOP_OVERLOAD(isgreater)
1407+
__SYCL_MARRAY_RELATIONAL_FUNCTION_BINOP_OVERLOAD(isgreaterequal)
1408+
__SYCL_MARRAY_RELATIONAL_FUNCTION_BINOP_OVERLOAD(isless)
1409+
__SYCL_MARRAY_RELATIONAL_FUNCTION_BINOP_OVERLOAD(islessequal)
1410+
__SYCL_MARRAY_RELATIONAL_FUNCTION_BINOP_OVERLOAD(islessgreater)
1411+
__SYCL_MARRAY_RELATIONAL_FUNCTION_UNOP_OVERLOAD(isfinite)
1412+
__SYCL_MARRAY_RELATIONAL_FUNCTION_UNOP_OVERLOAD(isinf)
1413+
__SYCL_MARRAY_RELATIONAL_FUNCTION_UNOP_OVERLOAD(isnan)
1414+
__SYCL_MARRAY_RELATIONAL_FUNCTION_UNOP_OVERLOAD(isnormal)
1415+
__SYCL_MARRAY_RELATIONAL_FUNCTION_BINOP_OVERLOAD(isordered)
1416+
__SYCL_MARRAY_RELATIONAL_FUNCTION_BINOP_OVERLOAD(isunordered)
1417+
__SYCL_MARRAY_RELATIONAL_FUNCTION_UNOP_OVERLOAD(signbit)
1418+
13801419
namespace detail {
13811420
#if defined(SYCL2020_CONFORMANT_APIS) && SYCL_LANGUAGE_VERSION >= 202001
13821421
using anyall_ret_t = bool;
@@ -1431,6 +1470,18 @@ detail::enable_if_t<detail::is_sgentype<T>::value, T> select(T a, T b,
14311470
return __sycl_std::__invoke_select<T>(a, b, static_cast<int>(c));
14321471
}
14331472

1473+
// mgentype select (mgentype a, mgentype b, marray<bool, { N }> c)
1474+
template <typename T,
1475+
typename = std::enable_if_t<detail::is_mgenfloat<T>::value>>
1476+
sycl::marray<detail::marray_element_type<T>, T::size()>
1477+
select(T a, T b, sycl::marray<bool, T::size()> c) __NOEXC {
1478+
sycl::marray<detail::marray_element_type<T>, T::size()> res;
1479+
for (int i = 0; i < a.size(); i++) {
1480+
res[i] = select(a[i], b[i], c[i]);
1481+
}
1482+
return res;
1483+
}
1484+
14341485
// geninteger select (geninteger a, geninteger b, igeninteger c)
14351486
template <typename T, typename T2>
14361487
detail::enable_if_t<

sycl/include/sycl/detail/generic_type_traits.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,13 @@ using is_vgenfloat = is_contained<T, gtl::vector_floating_list>;
5757
template <typename T>
5858
using is_svgenfloat = is_contained<T, gtl::scalar_vector_floating_list>;
5959

60+
template <typename T> using marray_element_type = typename T::value_type;
61+
62+
template <typename T>
63+
using is_mgenfloat = bool_constant<
64+
std::is_same<T, sycl::marray<marray_element_type<T>, T::size()>>::value &&
65+
is_svgenfloat<marray_element_type<T>>::value>;
66+
6067
template <typename T>
6168
using is_gengeofloat = is_contained<T, gtl::geo_float_list>;
6269

0 commit comments

Comments
 (0)