From 49bbcbf52f2f553b740aa6c46650061f05fa99ff Mon Sep 17 00:00:00 2001 From: Nikita Kornev Date: Sun, 25 Jun 2023 20:51:49 +0200 Subject: [PATCH] [SYCL] Make SYCL geometrical functions overloads instead of templates (#10014) It was decided to change all built-in functions from templates to overloads. This patch changes non-marray part of "4.17.8. Geometric functions". Marray part: https://github.com/intel/llvm/pull/10048 Spec: https://github.com/KhronosGroup/SYCL-Docs/pull/428 --------- Co-authored-by: Steffen Larsen --- sycl/include/sycl/builtins.hpp | 221 +++++++++++++++------------------ 1 file changed, 102 insertions(+), 119 deletions(-) diff --git a/sycl/include/sycl/builtins.hpp b/sycl/include/sycl/builtins.hpp index 211f5d891f2d0..69db7f4c27bf7 100644 --- a/sycl/include/sycl/builtins.hpp +++ b/sycl/include/sycl/builtins.hpp @@ -60,6 +60,10 @@ namespace __sycl_std = __host_std; __SYCL_BUILTIN_DEF(TYPE##3) \ __SYCL_BUILTIN_DEF(TYPE##4) +#define __SYCL_DEF_BUILTIN_GEOCROSSVEC(TYPE) \ + __SYCL_BUILTIN_DEF(TYPE##3) \ + __SYCL_BUILTIN_DEF(TYPE##4) + #define __SYCL_DEF_BUILTIN_MARRAY(TYPE) #define __SYCL_DEF_BUILTIN_CHAR_SCALAR __SYCL_BUILTIN_DEF(char) @@ -255,6 +259,8 @@ 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_GEOCROSSVEC \ + __SYCL_DEF_BUILTIN_GEOCROSSVEC(float) #define __SYCL_DEF_BUILTIN_FLOAT_MARRAY __SYCL_DEF_BUILTIN_MARRAY(float) #define __SYCL_DEF_BUILTIN_FLOATN \ __SYCL_DEF_BUILTIN_FLOAT_VEC \ @@ -269,6 +275,8 @@ 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_GEOCROSSVEC \ + __SYCL_DEF_BUILTIN_GEOCROSSVEC(double) #define __SYCL_DEF_BUILTIN_DOUBLE_MARRAY __SYCL_DEF_BUILTIN_MARRAY(double) #define __SYCL_DEF_BUILTIN_DOUBLEN \ __SYCL_DEF_BUILTIN_DOUBLE_VEC \ @@ -283,6 +291,7 @@ 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_GEOCROSSVEC __SYCL_DEF_BUILTIN_GEOCROSSVEC(half) #define __SYCL_DEF_BUILTIN_HALF_MARRAY __SYCL_DEF_BUILTIN_MARRAY(half) #define __SYCL_DEF_BUILTIN_HALFN \ __SYCL_DEF_BUILTIN_HALF_VEC \ @@ -314,8 +323,17 @@ namespace __sycl_std = __host_std; __SYCL_DEF_BUILTIN_GENGEOFLOATD \ __SYCL_DEF_BUILTIN_GENGEOFLOATH -// TODO: Replace with overloads. +#define __SYCL_DEF_BUILTIN_VGENGEOCROSSFLOAT \ + __SYCL_DEF_BUILTIN_FLOAT_GEOCROSSVEC \ + __SYCL_DEF_BUILTIN_DOUBLE_GEOCROSSVEC \ + __SYCL_DEF_BUILTIN_HALF_GEOCROSSVEC + +#define __SYCL_DEF_BUILTIN_VGENGEOFLOAT \ + __SYCL_DEF_BUILTIN_FLOAT_GEOVEC \ + __SYCL_DEF_BUILTIN_DOUBLE_GEOVEC \ + __SYCL_DEF_BUILTIN_HALF_GEOVEC +// TODO: Replace with overloads. #ifdef __FAST_MATH__ #define __FAST_MATH_GENFLOAT(T) \ (detail::is_svgenfloatd::value || detail::is_svgenfloath::value) @@ -1942,141 +1960,106 @@ __SYCL_MARRAY_INTEGER_FUNCTION_UPSAMPLE_IU_OVERLOAD(upsample, 32bit) // double4 cross (double4 p0, double4 p1) // half3 cross (half3 p0, half3 p1) // half4 cross (half4 p0, half4 p1) -template -std::enable_if_t::value, T> cross(T p0, T p1) __NOEXC { - return __sycl_std::__invoke_cross(p0, p1); -} +#define __SYCL_BUILTIN_DEF(TYPE) \ + inline TYPE cross(TYPE p0, TYPE p1) __NOEXC { \ + return __sycl_std::__invoke_cross(p0, p1); \ + } +__SYCL_DEF_BUILTIN_VGENGEOCROSSFLOAT +#undef __SYCL_BUILTIN_DEF +#undef __SYCL_DEF_BUILTIN_VGENGEOCROSSFLOAT +#undef __SYCL_DEF_BUILTIN_HALF_GEOCROSSVEC +#undef __SYCL_DEF_BUILTIN_DOUBLE_GEOCROSSVEC +#undef __SYCL_DEF_BUILTIN_FLOAT_GEOCROSSVEC +#undef __SYCL_DEF_BUILTIN_GEOCROSSVEC // float dot (float p0, float p1) // double dot (double p0, double p1) // half dot (half p0, half p1) -template -std::enable_if_t::value, T> dot(T p0, T p1) __NOEXC { - return p0 * p1; -} - +#define __SYCL_BUILTIN_DEF(TYPE) \ + inline TYPE dot(TYPE p0, TYPE p1) __NOEXC { return p0 * p1; } +__SYCL_DEF_BUILTIN_SGENFLOAT +#undef __SYCL_BUILTIN_DEF // float dot (vgengeofloat p0, vgengeofloat p1) -template -std::enable_if_t::value, float> dot(T p0, - T p1) __NOEXC { - return __sycl_std::__invoke_Dot(p0, p1); -} - // double dot (vgengeodouble p0, vgengeodouble p1) -template -std::enable_if_t::value, double> dot(T p0, - T p1) __NOEXC { - return __sycl_std::__invoke_Dot(p0, p1); -} - // half dot (vgengeohalf p0, vgengeohalf p1) -template -std::enable_if_t::value, half> dot(T p0, - T p1) __NOEXC { - return __sycl_std::__invoke_Dot(p0, p1); -} - -// float distance (gengeofloat p0, gengeofloat p1) -template ::value, T>> -float distance(T p0, T p1) __NOEXC { - return __sycl_std::__invoke_distance(p0, p1); -} - -// double distance (gengeodouble p0, gengeodouble p1) -template ::value, T>> -double distance(T p0, T p1) __NOEXC { - return __sycl_std::__invoke_distance(p0, p1); -} - -// half distance (gengeohalf p0, gengeohalf p1) -template ::value, T>> -half distance(T p0, T p1) __NOEXC { - return __sycl_std::__invoke_distance(p0, p1); -} - -// float length (gengeofloat p) -template ::value, T>> -float length(T p) __NOEXC { - return __sycl_std::__invoke_length(p); -} - -// double length (gengeodouble p) -template ::value, T>> -double length(T p) __NOEXC { - return __sycl_std::__invoke_length(p); -} - -// half length (gengeohalf p) -template ::value, T>> -half length(T p) __NOEXC { - return __sycl_std::__invoke_length(p); -} +#define __SYCL_BUILTIN_DEF(TYPE) \ + inline TYPE::element_type dot(TYPE p0, TYPE p1) __NOEXC { \ + return __sycl_std::__invoke_Dot(p0, p1); \ + } +__SYCL_DEF_BUILTIN_VGENGEOFLOAT +#undef __SYCL_BUILTIN_DEF + +// float distance (float p0, float p1) +// double distance (double p0, double p1) +// half distance (half p0, half p1) +#define __SYCL_BUILTIN_DEF(TYPE) \ + inline TYPE distance(TYPE p0, TYPE p1) __NOEXC { \ + return __sycl_std::__invoke_distance(p0, p1); \ + } +__SYCL_DEF_BUILTIN_SGENFLOAT +#undef __SYCL_BUILTIN_DEF +// float distance (vgengeofloat p0, vgengeofloat p1) +// double distance (vgengeodouble p0, vgengeodouble p1) +// half distance (vgengeohalf p0, vgengeohalf p1) +#define __SYCL_BUILTIN_DEF(TYPE) \ + inline TYPE::element_type distance(TYPE p0, TYPE p1) __NOEXC { \ + return __sycl_std::__invoke_distance(p0, p1); \ + } +__SYCL_DEF_BUILTIN_VGENGEOFLOAT +#undef __SYCL_BUILTIN_DEF + +// float length (float p0, float p1) +// double length (double p0, double p1) +// half length (half p0, half p1) +#define __SYCL_BUILTIN_DEF(TYPE) \ + inline TYPE length(TYPE p) __NOEXC { \ + return __sycl_std::__invoke_length(p); \ + } +__SYCL_DEF_BUILTIN_SGENFLOAT +#undef __SYCL_BUILTIN_DEF +// float length (vgengeofloat p0, vgengeofloat p1) +// double length (vgengeodouble p0, vgengeodouble p1) +// half length (vgengeohalf p0, vgengeohalf p1) +#define __SYCL_BUILTIN_DEF(TYPE) \ + inline TYPE::element_type length(TYPE p) __NOEXC { \ + return __sycl_std::__invoke_length(p); \ + } +__SYCL_DEF_BUILTIN_VGENGEOFLOAT +#undef __SYCL_BUILTIN_DEF // gengeofloat normalize (gengeofloat p) -template -std::enable_if_t::value, T> normalize(T p) __NOEXC { - return __sycl_std::__invoke_normalize(p); -} - // gengeodouble normalize (gengeodouble p) -template -std::enable_if_t::value, T> normalize(T p) __NOEXC { - return __sycl_std::__invoke_normalize(p); -} - // gengeohalf normalize (gengeohalf p) -template -std::enable_if_t::value, T> normalize(T p) __NOEXC { - return __sycl_std::__invoke_normalize(p); -} +#define __SYCL_BUILTIN_DEF(TYPE) \ + inline TYPE normalize(TYPE p) __NOEXC { \ + return __sycl_std::__invoke_normalize(p); \ + } +__SYCL_DEF_BUILTIN_GENGEOFLOAT +#undef __SYCL_BUILTIN_DEF // float fast_distance (gengeofloat p0, gengeofloat p1) -template ::value, T>> -float fast_distance(T p0, T p1) __NOEXC { - return __sycl_std::__invoke_fast_distance(p0, p1); -} - -// double fast_distance (gengeodouble p0, gengeodouble p1) -template ::value, T>> -double fast_distance(T p0, T p1) __NOEXC { - return __sycl_std::__invoke_fast_distance(p0, p1); -} +#define __SYCL_BUILTIN_DEF(TYPE) \ + inline float fast_distance(TYPE p0, TYPE p1) __NOEXC { \ + return __sycl_std::__invoke_fast_distance(p0, p1); \ + } +__SYCL_DEF_BUILTIN_GENGEOFLOATF +#undef __SYCL_BUILTIN_DEF // float fast_length (gengeofloat p) -template ::value, T>> -float fast_length(T p) __NOEXC { - return __sycl_std::__invoke_fast_length(p); -} - -// double fast_length (gengeodouble p) -template ::value, T>> -double fast_length(T p) __NOEXC { - return __sycl_std::__invoke_fast_length(p); -} +#define __SYCL_BUILTIN_DEF(TYPE) \ + inline float fast_length(TYPE p) __NOEXC { \ + return __sycl_std::__invoke_fast_length(p); \ + } +__SYCL_DEF_BUILTIN_GENGEOFLOATF +#undef __SYCL_BUILTIN_DEF // gengeofloat fast_normalize (gengeofloat p) -template -std::enable_if_t::value, T> -fast_normalize(T p) __NOEXC { - return __sycl_std::__invoke_fast_normalize(p); -} - -// gengeodouble fast_normalize (gengeodouble p) -template -std::enable_if_t::value, T> -fast_normalize(T p) __NOEXC { - return __sycl_std::__invoke_fast_normalize(p); -} +#define __SYCL_BUILTIN_DEF(TYPE) \ + inline TYPE fast_normalize(TYPE p) __NOEXC { \ + return __sycl_std::__invoke_fast_normalize(p); \ + } +__SYCL_DEF_BUILTIN_GENGEOFLOATF +#undef __SYCL_BUILTIN_DEF // marray geometric functions