From cf2d15f2e195a18a0b8cb9351815b641f2c0264e Mon Sep 17 00:00:00 2001 From: mdimakov Date: Mon, 27 Sep 2021 13:37:14 +0300 Subject: [PATCH 1/4] Add support for std::byte Signed-off-by: mdimakov --- .../CL/sycl/detail/generic_type_lists.hpp | 14 +- sycl/include/CL/sycl/types.hpp | 168 ++++++++++++------ 2 files changed, 128 insertions(+), 54 deletions(-) diff --git a/sycl/include/CL/sycl/detail/generic_type_lists.hpp b/sycl/include/CL/sycl/detail/generic_type_lists.hpp index 9965ea66eee9a..92e8ba00dd658 100644 --- a/sycl/include/CL/sycl/detail/generic_type_lists.hpp +++ b/sycl/include/CL/sycl/detail/generic_type_lists.hpp @@ -12,6 +12,8 @@ #include #include +#include + // Generic type name description, which serves as a description for all valid // types of parameters to kernel functions @@ -285,6 +287,15 @@ using vector_long_integer_list = type_list; +// std::byte +using byte_list = type_list; + +using vector_byte_list = + type_list, vec, vec, + vec, vec, + vec>; + + // integer types using scalar_signed_integer_list = type_list< conditional_t::value, @@ -317,7 +328,8 @@ using vector_unsigned_integer_list = vector_unsigned_char_list>, vector_unsigned_char_list>, vector_unsigned_short_list, vector_unsigned_int_list, - vector_unsigned_long_list, vector_unsigned_longlong_list>; + vector_unsigned_long_list, vector_unsigned_longlong_list, + vector_byte_list>; using unsigned_integer_list = type_list; diff --git a/sycl/include/CL/sycl/types.hpp b/sycl/include/CL/sycl/types.hpp index c63caada69ab3..04379df68d366 100644 --- a/sycl/include/CL/sycl/types.hpp +++ b/sycl/include/CL/sycl/types.hpp @@ -98,6 +98,23 @@ struct elem { namespace detail { +template struct vec_helper { + using RetType = T; + static constexpr RetType get(T value) { + return value; + } +}; + +template<> struct vec_helper { + using RetType = std::uint8_t; + static constexpr RetType get(std::byte value) { + return (RetType)value; + } + static constexpr std::byte get(std::uint8_t value) { + return (std::byte)value; + } +}; + template class OperationCurrentT, int... Indexes> class SwizzleOp; @@ -120,8 +137,8 @@ using rel_t = typename detail::conditional_t< template class GetOp { public: using DataT = T; - DataT getValue(size_t) const { return 0; } - DataT operator()(DataT, DataT) { return 0; } + DataT getValue(size_t) const { return (DataT)0; } + DataT operator()(DataT, DataT) { return (DataT)0; } }; // Special type for working SwizzleOp with scalars, stores a scalar and gives @@ -511,6 +528,12 @@ class RoundedRangeKernelWithKH; } // namespace detail +template +using vec_data = detail::vec_helper; + +template +using vec_data_t = typename detail::vec_helper::RetType; + #if defined(_WIN32) && (_MSC_VER) // MSVC Compiler doesn't allow using of function arguments with alignment // requirements. MSVC Compiler Error C2719: 'parameter': formal parameter with @@ -667,7 +690,7 @@ template class vec { // W/o this, things like "vec = vec" doesn't work. template typename detail::enable_if_t::value && - std::is_convertible::value, + std::is_convertible, rel_t>::value, vec &> operator=(const vec &Rhs) { *this = Rhs.template as(); @@ -690,16 +713,16 @@ template class vec { template explicit constexpr vec(const EnableIfNotHostHalf &arg) { - m_Data = (DataType)arg; + m_Data = (DataType)vec_data::get(arg); } template typename detail::enable_if_t< - std::is_fundamental::value || + std::is_fundamental>::value || std::is_same, half>::value, vec &> operator=(const EnableIfNotHostHalf &Rhs) { - m_Data = (DataType)Rhs; + m_Data = (DataType)vec_data::get(Rhs); return *this; } @@ -712,7 +735,7 @@ template class vec { template typename detail::enable_if_t< - std::is_fundamental::value || + std::is_fundamental>::value || std::is_same, half>::value, vec &> operator=(const EnableIfHostHalf &Rhs) { @@ -730,7 +753,7 @@ template class vec { template typename detail::enable_if_t< - std::is_fundamental::value || + std::is_fundamental>::value || std::is_same, half>::value, vec &> operator=(const DataT &Rhs) { @@ -753,22 +776,26 @@ template class vec { template constexpr vec(const EnableIfMultipleElems<2, Ty> Arg0, const EnableIfNotHostHalf Arg1) - : m_Data{Arg0, Arg1} {} + : m_Data{vec_data::get(Arg0), vec_data::get(Arg1)} {} template constexpr vec(const EnableIfMultipleElems<3, Ty> Arg0, const EnableIfNotHostHalf Arg1, const DataT Arg2) - : m_Data{Arg0, Arg1, Arg2} {} + : m_Data{vec_data::get(Arg0), vec_data::get(Arg1), vec_data::get(Arg2)} {} template constexpr vec(const EnableIfMultipleElems<4, Ty> Arg0, const EnableIfNotHostHalf Arg1, const DataT Arg2, const Ty Arg3) - : m_Data{Arg0, Arg1, Arg2, Arg3} {} + : m_Data{vec_data::get(Arg0), vec_data::get(Arg1), + vec_data::get(Arg2), vec_data::get(Arg3)} {} template constexpr vec(const EnableIfMultipleElems<8, Ty> Arg0, const EnableIfNotHostHalf Arg1, const DataT Arg2, const DataT Arg3, const DataT Arg4, const DataT Arg5, const DataT Arg6, const DataT Arg7) - : m_Data{Arg0, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7} {} + : m_Data{vec_data::get(Arg0), vec_data::get(Arg1), + vec_data::get(Arg2), vec_data::get(Arg3), + vec_data::get(Arg4), vec_data::get(Arg5), + vec_data::get(Arg6), vec_data::get(Arg7)} {} template constexpr vec(const EnableIfMultipleElems<16, Ty> Arg0, const EnableIfNotHostHalf Arg1, const DataT Arg2, @@ -777,8 +804,14 @@ template class vec { const DataT Arg9, const DataT ArgA, const DataT ArgB, const DataT ArgC, const DataT ArgD, const DataT ArgE, const DataT ArgF) - : m_Data{Arg0, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, - Arg8, Arg9, ArgA, ArgB, ArgC, ArgD, ArgE, ArgF} {} + : m_Data{vec_data::get(Arg0), vec_data::get(Arg1), + vec_data::get(Arg2), vec_data::get(Arg3), + vec_data::get(Arg4), vec_data::get(Arg5), + vec_data::get(Arg6), vec_data::get(Arg7), + vec_data::get(Arg8), vec_data::get(Arg9), + vec_data::get(ArgA), vec_data::get(ArgB), + vec_data::get(ArgC), vec_data::get(ArgD), + vec_data::get(ArgE), vec_data::get(ArgF)} {} #endif // Constructor from values of base type or vec of base type. Checks that @@ -811,7 +844,7 @@ template class vec { // Available only when: NumElements == 1 template operator typename detail::enable_if_t() const { - return m_Data; + return vec_data::get(m_Data); } __SYCL2020_DEPRECATED("get_count() is deprecated, please use size() instead") @@ -825,17 +858,18 @@ template class vec { template vec convert() const { - static_assert(std::is_integral::value || + static_assert(std::is_integral>::value || detail::is_floating_point::value, "Unsupported convertT"); vec Result; - using OpenCLT = detail::ConvertToOpenCLType_t; - using OpenCLR = detail::ConvertToOpenCLType_t; + using OpenCLT = detail::ConvertToOpenCLType_t>; + using OpenCLR = detail::ConvertToOpenCLType_t>; for (size_t I = 0; I < NumElements; ++I) { Result.setValue( I, - detail::convertImpl( - getValue(I))); + vec_data::get(detail::convertImpl, + vec_data_t, roundingMode, OpenCLT, OpenCLR>( + vec_data::get(getValue(I))))); } return Result; } @@ -963,7 +997,7 @@ template class vec { template \ typename detail::enable_if_t< \ std::is_convertible::value && \ - (std::is_fundamental::value || \ + (std::is_fundamental>::value || \ std::is_same, half>::value), \ vec> \ operator BINOP(const T &Rhs) const { \ @@ -991,7 +1025,7 @@ template class vec { template \ typename detail::enable_if_t< \ std::is_convertible::value && \ - (std::is_fundamental::value || \ + (std::is_fundamental>::value || \ std::is_same, half>::value), \ vec> \ operator BINOP(const T &Rhs) const { \ @@ -1049,7 +1083,7 @@ template class vec { } \ template \ typename detail::enable_if_t::value && \ - (std::is_fundamental::value || \ + (std::is_fundamental>::value || \ std::is_same::value), \ vec> \ operator RELLOGOP(const T &Rhs) const { \ @@ -1060,13 +1094,13 @@ template class vec { vec operator RELLOGOP(const vec &Rhs) const { \ vec Ret; \ for (size_t I = 0; I < NumElements; ++I) { \ - Ret.setValue(I, -(getValue(I) RELLOGOP Rhs.getValue(I))); \ + Ret.setValue(I, -(vec_data::get(getValue(I)) RELLOGOP vec_data::get(Rhs.getValue(I)))); \ } \ return Ret; \ } \ template \ typename detail::enable_if_t::value && \ - (std::is_fundamental::value || \ + (std::is_fundamental>::value || \ std::is_same::value), \ vec> \ operator RELLOGOP(const T &Rhs) const { \ @@ -1090,12 +1124,12 @@ template class vec { #endif #define __SYCL_UOP(UOP, OPASSIGN) \ vec &operator UOP() { \ - *this OPASSIGN 1; \ + *this OPASSIGN vec_data::get(1); \ return *this; \ } \ vec operator UOP(int) { \ vec Ret(*this); \ - *this OPASSIGN 1; \ + *this OPASSIGN vec_data::get(1); \ return Ret; \ } @@ -1106,7 +1140,7 @@ template class vec { // Available only when: dataT != cl_float && dataT != cl_double // && dataT != cl_half template - typename detail::enable_if_t::value, vec> + typename detail::enable_if_t>::value, vec> operator~() const { // Use __SYCL_DEVICE_ONLY__ macro because cast to OpenCL vector type is defined // by SYCL device compiler only. @@ -1145,7 +1179,8 @@ template class vec { #else vec Ret; for (size_t I = 0; I < NumElements; ++I) - Ret.setValue(I, +getValue(I)); + Ret.setValue(I, vec_data::get( + +vec_data::get(getValue(I)))); return Ret; #endif } @@ -1158,7 +1193,8 @@ template class vec { #else vec Ret; for (size_t I = 0; I < NumElements; ++I) - Ret.setValue(I, -getValue(I)); + Ret.setValue(I, vec_data::get( + -vec_data::get(getValue(I)))); return Ret; #endif } @@ -1214,50 +1250,50 @@ template class vec { typename = typename detail::enable_if_t<1 != Num>> constexpr void setValue(EnableIfNotHostHalf Index, const DataT &Value, int) { - m_Data[Index] = Value; + m_Data[Index] = vec_data::get(Value); } template > DataT getValue(EnableIfNotHostHalf Index, int) const { - return m_Data[Index]; + return vec_data::get(m_Data[Index]); } template > constexpr void setValue(EnableIfHostHalf Index, const DataT &Value, int) { - m_Data.s[Index] = Value; + m_Data.s[Index] = vec_data::get(Value); // how do we check enableifhosthalf for int? why? } template > DataT getValue(EnableIfHostHalf Index, int) const { - return m_Data.s[Index]; + return vec_data::get(m_Data.s[Index]); // the same question as above } #else // __SYCL_USE_EXT_VECTOR_TYPE__ template > constexpr void setValue(int Index, const DataT &Value, int) { - m_Data.s[Index] = Value; + m_Data.s[Index] = vec_data::get(Value); } template > DataT getValue(int Index, int) const { - return m_Data.s[Index]; + return vec_data::get(m_Data.s[Index]); } #endif // __SYCL_USE_EXT_VECTOR_TYPE__ template > constexpr void setValue(int, const DataT &Value, float) { - m_Data = Value; + m_Data = vec_data::get(Value); } template > DataT getValue(int, float) const { - return m_Data; + return vec_data::get(m_Data); } // Special proxies as specialization is not allowed in class scope. @@ -1397,13 +1433,13 @@ class SwizzleOp { template using EnableIfScalarType = typename detail::enable_if_t< std::is_convertible::value && - (std::is_fundamental::value || + (std::is_fundamental>::value || std::is_same, half>::value)>; template using EnableIfNoScalarType = typename detail::enable_if_t< !std::is_convertible::value || - !(std::is_fundamental::value || + !(std::is_fundamental>::value || std::is_same, half>::value)>; template @@ -1504,7 +1540,7 @@ class SwizzleOp { #undef __SYCL_UOP template - typename detail::enable_if_t::value, vec_t> operator~() { + typename detail::enable_if_t>::value, vec_t> operator~() { vec_t Tmp = *this; return ~Tmp; } @@ -1886,9 +1922,9 @@ class SwizzleOp { std::array Idxs{Indexes...}; return m_Vector->getValue(Idxs[Index]); } - auto Op = OperationCurrentT(); - return Op(m_LeftOperation.getValue(Index), - m_RightOperation.getValue(Index)); + auto Op = OperationCurrentT>(); + return vec_data::get(Op(vec_data::get(m_LeftOperation.getValue(Index)), + vec_data::get(m_RightOperation.getValue(Index)))); } template @@ -1897,17 +1933,18 @@ class SwizzleOp { std::array Idxs{Indexes...}; return m_Vector->getValue(Idxs[Index]); } - auto Op = OperationCurrentT(); - return Op(m_LeftOperation.getValue(Index), - m_RightOperation.getValue(Index)); + auto Op = OperationCurrentT>(); + return vec_data::get(Op(vec_data::get(m_LeftOperation.getValue(Index)), + vec_data::get(m_RightOperation.getValue(Index)))); } template