Skip to content

Commit

Permalink
[SYCL] Make SYCL geometrical marray functions overloads instead of te…
Browse files Browse the repository at this point in the history
…mplates (intel#10048)

It was decided to change all built-in functions from templates to
overloads. This patch changes marray part of "4.17.8. Geometric
functions".

Non-marray part: intel#10014

Spec: KhronosGroup/SYCL-Docs#428
  • Loading branch information
KornevNikita authored Jun 26, 2023
1 parent 2ab99aa commit 3c95fc4
Showing 1 changed file with 97 additions and 51 deletions.
148 changes: 97 additions & 51 deletions sycl/include/sycl/builtins.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ template <class T, int N> marray<T, N> to_marray(vec<T, N> x) {
namespace __sycl_std = __host_std;
#endif

#define __SYCL_COMMA ,

#define __SYCL_DEF_BUILTIN_VEC(TYPE) \
__SYCL_BUILTIN_DEF(TYPE##2) \
__SYCL_BUILTIN_DEF(TYPE##3) \
Expand All @@ -64,6 +66,15 @@ namespace __sycl_std = __host_std;
__SYCL_BUILTIN_DEF(TYPE##3) \
__SYCL_BUILTIN_DEF(TYPE##4)

#define __SYCL_DEF_BUILTIN_GEOMARRAY(TYPE) \
__SYCL_BUILTIN_DEF(marray<TYPE __SYCL_COMMA 2>) \
__SYCL_BUILTIN_DEF(marray<TYPE __SYCL_COMMA 3>) \
__SYCL_BUILTIN_DEF(marray<TYPE __SYCL_COMMA 4>)

#define __SYCL_DEF_BUILTIN_GEOCROSSMARRAY(TYPE) \
__SYCL_BUILTIN_DEF(marray<TYPE __SYCL_COMMA 3>) \
__SYCL_BUILTIN_DEF(marray<TYPE __SYCL_COMMA 4>)

#define __SYCL_DEF_BUILTIN_MARRAY(TYPE)

#define __SYCL_DEF_BUILTIN_CHAR_SCALAR __SYCL_BUILTIN_DEF(char)
Expand Down Expand Up @@ -259,6 +270,9 @@ namespace __sycl_std = __host_std;
#define __SYCL_DEF_BUILTIN_FLOAT_SCALAR __SYCL_BUILTIN_DEF(float)
#define __SYCL_DEF_BUILTIN_FLOAT_VEC __SYCL_DEF_BUILTIN_VEC(float)
#define __SYCL_DEF_BUILTIN_FLOAT_GEOVEC __SYCL_DEF_BUILTIN_GEOVEC(float)
#define __SYCL_DEF_BUILTIN_FLOAT_GEOCROSSMARRAY \
__SYCL_DEF_BUILTIN_GEOCROSSMARRAY(float)
#define __SYCL_DEF_BUILTIN_FLOAT_GEOMARRAY __SYCL_DEF_BUILTIN_GEOMARRAY(float)
#define __SYCL_DEF_BUILTIN_FLOAT_GEOCROSSVEC \
__SYCL_DEF_BUILTIN_GEOCROSSVEC(float)
#define __SYCL_DEF_BUILTIN_FLOAT_MARRAY __SYCL_DEF_BUILTIN_MARRAY(float)
Expand All @@ -275,6 +289,9 @@ namespace __sycl_std = __host_std;
#define __SYCL_DEF_BUILTIN_DOUBLE_SCALAR __SYCL_BUILTIN_DEF(double)
#define __SYCL_DEF_BUILTIN_DOUBLE_VEC __SYCL_DEF_BUILTIN_VEC(double)
#define __SYCL_DEF_BUILTIN_DOUBLE_GEOVEC __SYCL_DEF_BUILTIN_GEOVEC(double)
#define __SYCL_DEF_BUILTIN_DOUBLE_GEOCROSSMARRAY \
__SYCL_DEF_BUILTIN_GEOCROSSMARRAY(double)
#define __SYCL_DEF_BUILTIN_DOUBLE_GEOMARRAY __SYCL_DEF_BUILTIN_GEOMARRAY(double)
#define __SYCL_DEF_BUILTIN_DOUBLE_GEOCROSSVEC \
__SYCL_DEF_BUILTIN_GEOCROSSVEC(double)
#define __SYCL_DEF_BUILTIN_DOUBLE_MARRAY __SYCL_DEF_BUILTIN_MARRAY(double)
Expand All @@ -291,6 +308,9 @@ namespace __sycl_std = __host_std;
#define __SYCL_DEF_BUILTIN_HALF_SCALAR __SYCL_BUILTIN_DEF(half)
#define __SYCL_DEF_BUILTIN_HALF_VEC __SYCL_DEF_BUILTIN_VEC(half)
#define __SYCL_DEF_BUILTIN_HALF_GEOVEC __SYCL_DEF_BUILTIN_GEOVEC(half)
#define __SYCL_DEF_BUILTIN_HALF_GEOCROSSMARRAY \
__SYCL_DEF_BUILTIN_GEOCROSSMARRAY(half)
#define __SYCL_DEF_BUILTIN_HALF_GEOMARRAY __SYCL_DEF_BUILTIN_GEOMARRAY(half)
#define __SYCL_DEF_BUILTIN_HALF_GEOCROSSVEC __SYCL_DEF_BUILTIN_GEOCROSSVEC(half)
#define __SYCL_DEF_BUILTIN_HALF_MARRAY __SYCL_DEF_BUILTIN_MARRAY(half)
#define __SYCL_DEF_BUILTIN_HALFN \
Expand Down Expand Up @@ -323,6 +343,17 @@ namespace __sycl_std = __host_std;
__SYCL_DEF_BUILTIN_GENGEOFLOATD \
__SYCL_DEF_BUILTIN_GENGEOFLOATH

#define __SYCL_DEF_BUILTIN_GENGEOCROSSMARRAY \
__SYCL_DEF_BUILTIN_FLOAT_GEOCROSSMARRAY \
__SYCL_DEF_BUILTIN_DOUBLE_GEOCROSSMARRAY \
__SYCL_DEF_BUILTIN_HALF_GEOCROSSMARRAY

#define __SYCL_DEF_BUILTIN_GENGEOMARRAY \
__SYCL_DEF_BUILTIN_FLOAT_GEOMARRAY \
__SYCL_DEF_BUILTIN_DOUBLE_GEOMARRAY \
__SYCL_DEF_BUILTIN_HALF_GEOMARRAY

// TODO: Replace with overloads.
#define __SYCL_DEF_BUILTIN_VGENGEOCROSSFLOAT \
__SYCL_DEF_BUILTIN_FLOAT_GEOCROSSVEC \
__SYCL_DEF_BUILTIN_DOUBLE_GEOCROSSVEC \
Expand Down Expand Up @@ -2063,67 +2094,81 @@ __SYCL_DEF_BUILTIN_GENGEOFLOATF

// marray geometric functions

#define __SYCL_MARRAY_GEOMETRIC_FUNCTION_OVERLOAD_IMPL(NAME, ...) \
vec<detail::marray_element_t<T>, T::size()> result_v; \
result_v = NAME(__VA_ARGS__); \
return detail::to_marray(result_v);

template <typename T>
std::enable_if_t<detail::is_gencrossmarray<T>::value, T> cross(T p0,
T p1) __NOEXC {
__SYCL_MARRAY_GEOMETRIC_FUNCTION_OVERLOAD_IMPL(cross, detail::to_vec(p0),
detail::to_vec(p1))
}
// cross
#define __SYCL_BUILTIN_DEF(TYPE) \
inline TYPE cross(TYPE p0, TYPE p1) __NOEXC { \
return detail::to_marray(cross(detail::to_vec(p0), detail::to_vec(p1))); \
}
__SYCL_DEF_BUILTIN_GENGEOCROSSMARRAY
#undef __SYCL_BUILTIN_DEF

template <typename T>
std::enable_if_t<detail::is_gengeomarray<T>::value, T> normalize(T p) __NOEXC {
__SYCL_MARRAY_GEOMETRIC_FUNCTION_OVERLOAD_IMPL(normalize, detail::to_vec(p))
}
#undef __SYCL_DEF_BUILTIN_GENGEOCROSSMARRAY
#undef __SYCL_DEF_BUILTIN_HALF_GEOCROSSMARRAY
#undef __SYCL_DEF_BUILTIN_DOUBLE_GEOCROSSMARRAY
#undef __SYCL_DEF_BUILTIN_FLOAT_GEOCROSSMARRAY
#undef __SYCL_DEF_BUILTIN_GEOCROSSMARRAY

template <typename T>
std::enable_if_t<detail::is_gengeomarrayfloat<T>::value, T>
fast_normalize(T p) __NOEXC {
__SYCL_MARRAY_GEOMETRIC_FUNCTION_OVERLOAD_IMPL(fast_normalize,
detail::to_vec(p))
}
// dot
#define __SYCL_BUILTIN_DEF(TYPE) \
inline TYPE::value_type dot(TYPE p0, TYPE p1) __NOEXC { \
return dot(detail::to_vec(p0), detail::to_vec(p1)); \
}
__SYCL_DEF_BUILTIN_GENGEOMARRAY
#undef __SYCL_BUILTIN_DEF

#undef __SYCL_MARRAY_GEOMETRIC_FUNCTION_OVERLOAD_IMPL
// distance
#define __SYCL_BUILTIN_DEF(TYPE) \
inline TYPE::value_type distance(TYPE p0, TYPE p1) __NOEXC { \
return distance(detail::to_vec(p0), detail::to_vec(p1)); \
}
__SYCL_DEF_BUILTIN_GENGEOMARRAY
#undef __SYCL_BUILTIN_DEF

#define __SYCL_MARRAY_GEOMETRIC_FUNCTION_IS_GENGEOMARRAY_BINOP_OVERLOAD(NAME) \
template <typename T> \
std::enable_if_t<detail::is_gengeomarray<T>::value, \
detail::marray_element_t<T>> \
NAME(T p0, T p1) __NOEXC { \
return NAME(detail::to_vec(p0), detail::to_vec(p1)); \
// length
#define __SYCL_BUILTIN_DEF(TYPE) \
inline TYPE::value_type length(TYPE p) __NOEXC { \
return length(detail::to_vec(p)); \
}
__SYCL_DEF_BUILTIN_GENGEOMARRAY
#undef __SYCL_BUILTIN_DEF

// clang-format off
__SYCL_MARRAY_GEOMETRIC_FUNCTION_IS_GENGEOMARRAY_BINOP_OVERLOAD(dot)
__SYCL_MARRAY_GEOMETRIC_FUNCTION_IS_GENGEOMARRAY_BINOP_OVERLOAD(distance)
// clang-format on
// normalize
#define __SYCL_BUILTIN_DEF(TYPE) \
inline TYPE normalize(TYPE p) __NOEXC { \
return detail::to_marray(normalize(detail::to_vec(p))); \
}
__SYCL_DEF_BUILTIN_GENGEOMARRAY
#undef __SYCL_BUILTIN_DEF

#undef __SYCL_MARRAY_GEOMETRIC_FUNCTION_IS_GENGEOMARRAY_BINOP_OVERLOAD
// fast_distance
#define __SYCL_BUILTIN_DEF(TYPE) \
inline float fast_distance(TYPE p0, TYPE p1) __NOEXC { \
return fast_distance(detail::to_vec(p0), detail::to_vec(p1)); \
}
__SYCL_DEF_BUILTIN_FLOAT_GEOMARRAY
#undef __SYCL_BUILTIN_DEF

template <typename T>
std::enable_if_t<detail::is_gengeomarray<T>::value, detail::marray_element_t<T>>
length(T p) __NOEXC {
return __sycl_std::__invoke_length<detail::marray_element_t<T>>(
detail::to_vec(p));
}
// fast_normalize
#define __SYCL_BUILTIN_DEF(TYPE) \
inline TYPE fast_normalize(TYPE p) __NOEXC { \
return detail::to_marray(fast_normalize(detail::to_vec(p))); \
}
__SYCL_DEF_BUILTIN_FLOAT_GEOMARRAY
#undef __SYCL_BUILTIN_DEF

template <typename T>
std::enable_if_t<detail::is_gengeomarrayfloat<T>::value,
detail::marray_element_t<T>>
fast_distance(T p0, T p1) __NOEXC {
return fast_distance(detail::to_vec(p0), detail::to_vec(p1));
}
// fast_length
#define __SYCL_BUILTIN_DEF(TYPE) \
inline float fast_length(TYPE p) __NOEXC { \
return fast_length(detail::to_vec(p)); \
}
__SYCL_DEF_BUILTIN_FLOAT_GEOMARRAY
#undef __SYCL_BUILTIN_DEF

template <typename T>
std::enable_if_t<detail::is_gengeomarrayfloat<T>::value,
detail::marray_element_t<T>>
fast_length(T p) __NOEXC {
return fast_length(detail::to_vec(p));
}
#undef __SYCL_DEF_BUILTIN_GENGEOMARRAY
#undef __SYCL_DEF_BUILTIN_HALF_GEOMARRAY
#undef __SYCL_DEF_BUILTIN_DOUBLE_GEOMARRAY
#undef __SYCL_DEF_BUILTIN_FLOAT_GEOMARRAY
#undef __SYCL_DEF_BUILTIN_GEOMARRAY

/* SYCL 1.2.1 ---- 4.13.7 Relational functions. -----------------------------*/
/* SYCL 2020 ---- 4.17.9 Relational functions. -----------------------------*/
Expand Down Expand Up @@ -2924,6 +2969,7 @@ std::enable_if_t<detail::is_svgenfloatf<T>::value, T> tan(T x) __NOEXC {
#undef __SYCL_DEF_BUILTIN_FAST_MATH_GENFLOAT
#undef __SYCL_DEF_BUILTIN_SGENTYPE
#undef __SYCL_DEF_BUILTIN_GENTYPE
#undef __SYCL_COMMA
} // __SYCL_INLINE_VER_NAMESPACE(_V1)
} // namespace sycl

Expand Down

0 comments on commit 3c95fc4

Please sign in to comment.