Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SYCL] Make SYCL geometrical marray functions overloads instead of templates #10048

Merged
merged 3 commits into from
Jun 26, 2023
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
152 changes: 98 additions & 54 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 ,
KornevNikita marked this conversation as resolved.
Show resolved Hide resolved

#define __SYCL_DEF_BUILTIN_VEC(TYPE) \
__SYCL_BUILTIN_DEF(TYPE##2) \
__SYCL_BUILTIN_DEF(TYPE##3) \
Expand All @@ -60,6 +62,15 @@ namespace __sycl_std = __host_std;
__SYCL_BUILTIN_DEF(TYPE##3) \
__SYCL_BUILTIN_DEF(TYPE##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_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_MARRAY(TYPE)

#define __SYCL_DEF_BUILTIN_CHAR_SCALAR __SYCL_BUILTIN_DEF(char)
Expand Down Expand Up @@ -255,6 +266,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_MARRAY __SYCL_DEF_BUILTIN_MARRAY(float)
#define __SYCL_DEF_BUILTIN_FLOATN \
__SYCL_DEF_BUILTIN_FLOAT_VEC \
Expand All @@ -269,6 +283,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_MARRAY __SYCL_DEF_BUILTIN_MARRAY(double)
#define __SYCL_DEF_BUILTIN_DOUBLEN \
__SYCL_DEF_BUILTIN_DOUBLE_VEC \
Expand All @@ -283,6 +300,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_MARRAY __SYCL_DEF_BUILTIN_MARRAY(half)
#define __SYCL_DEF_BUILTIN_HALFN \
__SYCL_DEF_BUILTIN_HALF_VEC \
Expand Down Expand Up @@ -314,6 +334,16 @@ 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.

#ifdef __FAST_MATH__
Expand Down Expand Up @@ -2080,67 +2110,81 @@ fast_normalize(T p) __NOEXC {

// 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))
}

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))
}

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))
}

#undef __SYCL_MARRAY_GEOMETRIC_FUNCTION_OVERLOAD_IMPL
// 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

#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

// 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

#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)); \
// 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

// clang-format off
__SYCL_MARRAY_GEOMETRIC_FUNCTION_IS_GENGEOMARRAY_BINOP_OVERLOAD(dot)
__SYCL_MARRAY_GEOMETRIC_FUNCTION_IS_GENGEOMARRAY_BINOP_OVERLOAD(distance)
// clang-format on
// 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

#undef __SYCL_MARRAY_GEOMETRIC_FUNCTION_IS_GENGEOMARRAY_BINOP_OVERLOAD
// 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

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_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_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_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_length(T p) __NOEXC {
return fast_length(detail::to_vec(p));
}
// 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

#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