22 namespace ext::intel::esimd::detail {
24 using bfloat16 = sycl::ext::oneapi::bfloat16;
26 template <>
struct element_type_traits<bfloat16> {
28 using RawT = uint_type_t<
sizeof(bfloat16)>;
31 using EnclosingCppT = float;
33 static inline constexpr
bool use_native_cpp_ops =
false;
34 static inline constexpr
bool is_floating_point =
true;
37 #ifdef __SYCL_DEVICE_ONLY__
40 using vc_be_bfloat16_raw_t = _Float16;
41 #endif // __SYCL_DEVICE_ONLY__
45 template <
int N>
struct vector_conversion_traits<bfloat16, N> {
46 using StdT = __cpp_t<bfloat16>;
47 using StdVecT = vector_type_t<StdT, N>;
48 using RawT = __raw_t<bfloat16>;
50 static ESIMD_INLINE vector_type_t<RawT, N>
51 convert_to_raw(vector_type_t<StdT, N> Val) {
52 #ifdef __SYCL_DEVICE_ONLY__
53 using RawVecT = vector_type_t<vc_be_bfloat16_raw_t, N>;
54 RawVecT ConvVal = __esimd_bf_cvt<vc_be_bfloat16_raw_t, StdT, N>(Val);
56 return sycl::bit_cast<vector_type_t<RawT, N>>(ConvVal);
58 vector_type_t<RawT, N> Output = 0;
60 for (
int i = 0; i < N; i++) {
61 Output[i] = sycl::bit_cast<RawT>(
static_cast<bfloat16
>(Val[i]));
64 #endif // __SYCL_DEVICE_ONLY__
67 static ESIMD_INLINE vector_type_t<StdT, N>
68 convert_to_cpp(vector_type_t<RawT, N> Val) {
69 #ifdef __SYCL_DEVICE_ONLY__
70 using RawVecT = vector_type_t<vc_be_bfloat16_raw_t, N>;
71 RawVecT Bits = sycl::bit_cast<RawVecT>(Val);
72 return __esimd_bf_cvt<StdT, vc_be_bfloat16_raw_t, N>(Bits);
74 vector_type_t<StdT, N> Output;
76 for (
int i = 0; i < N; i++) {
77 Output[i] = sycl::bit_cast<bfloat16>(Val[i]);
80 #endif // __SYCL_DEVICE_ONLY__
86 template <>
struct scalar_conversion_traits<bfloat16> {
87 using RawT = __raw_t<bfloat16>;
89 static ESIMD_INLINE RawT bitcast_to_raw(bfloat16 Val) {
90 return sycl::bit_cast<RawT>(Val);
93 static ESIMD_INLINE bfloat16 bitcast_to_wrapper(RawT Val) {
94 return sycl::bit_cast<bfloat16>(Val);
102 inline std::ostream &
operator<<(std::ostream &O, bfloat16
const &rhs) {
103 O << static_cast<float>(rhs);