pRC
multi-purpose Tensor Train library for C++
Loading...
Searching...
No Matches
bfloat16.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_CORE_VALUE_BFLOAT16_H
4#define pRC_CORE_VALUE_BFLOAT16_H
5
6#include <cmath>
7#include <cstring>
8
13#include <prc/pragma.hpp>
14
15namespace pRC
16{
26 {
27 private:
28 using Representation = std::uint16_t;
29 using Float32 = float;
30
31 static_assert(sizeof(Float32) == 2 * sizeof(Representation));
32
33 public:
34 static constexpr auto FromRepresentation(Representation const rep)
35 {
36 BFloat16 half = {};
37 half.mHalf = rep;
38 return half;
39 }
40
41 public:
42 ~BFloat16() = default;
43 constexpr BFloat16(BFloat16 const &) = default;
44 constexpr BFloat16(BFloat16 &&) = default;
45 constexpr BFloat16 &operator=(BFloat16 const &) & = default;
46 constexpr BFloat16 &operator=(BFloat16 &&) & = default;
47 constexpr BFloat16() = default;
48
49 BFloat16(Float32 const single)
50 {
51 using std::isnan;
52 if(isnan(single))
53 {
54 mHalf = 0x7FC0;
55 return;
56 }
57
58#ifdef __FAST_MATH__
59 auto src = reinterpret_cast<std::uint16_t const *>(&single);
60
61# if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
62 mHalf = src[0];
63# else
64 mHalf = src[1];
65# endif // __BYTE_ORDER__
66
67#else
68 std::uint32_t src;
69 std::memcpy(&src, &single, sizeof(src));
70 auto lsb = (src >> 16) & std::uint32_t(1);
71 auto bias = 0x7FFF + lsb;
72 src += bias;
73 mHalf = static_cast<std::uint16_t>(src >> 16);
74#endif // __FAST_MATH__
75 }
76
77 operator Float32() const
78 {
79 Float32 single;
80
81 auto dst = reinterpret_cast<std::uint16_t *>(&single);
82
83#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
84 dst[0] = mHalf;
85 dst[1] = 0;
86#else
87 dst[0] = 0;
88 dst[1] = mHalf;
89#endif // __BYTE_ORDER__
90
91 BEGIN_IGNORE_DIAGNOSTIC_GCC("-Wuninitialized")
92 return single;
94 }
95
96 constexpr auto isNaN() const
97 {
98#if !defined(__FINITE_MATH_ONLY__) || __FINITE_MATH_ONLY__ == 0
99 return mHalf == 0x7FC0;
100#else
101 return false;
102#endif // ! __FINITE_MATH_ONLY__
103 }
104
105 template<class X, If<IsInvocable<Add, BFloat16 &, X>> = 0>
106 constexpr auto &operator+=(X &&rhs) &
107 {
108 return *this = *this + forward<X>(rhs);
109 }
110
111 template<class X, If<IsInvocable<Sub, BFloat16 &, X>> = 0>
112 constexpr auto &operator-=(X &&rhs) &
113 {
114 return *this = *this - forward<X>(rhs);
115 }
116
117 template<class X, If<IsInvocable<Mul, BFloat16 &, X>> = 0>
118 constexpr auto &operator*=(X &&rhs) &
119 {
120 return *this = *this * forward<X>(rhs);
121 }
122
123 template<class X, If<IsInvocable<Div, BFloat16 &, X>> = 0>
124 constexpr auto &operator/=(X &&rhs) &
125 {
126 return *this = *this / forward<X>(rhs);
127 }
128
129 constexpr auto operator==(BFloat16 const rhs)
130 {
131 return mHalf == rhs.mHalf;
132 }
133
134 constexpr auto operator!=(BFloat16 const rhs)
135 {
136 return mHalf != rhs.mHalf;
137 }
138
139 auto operator+() const
140 {
141 return Float32(*this);
142 }
143
144 constexpr auto operator-() const
145 {
146 return FromRepresentation(mHalf ^ 0x8000);
147 }
148
149 private:
150 Representation mHalf;
151 };
152
153 static inline constexpr auto isnan(BFloat16 const a)
154 {
155 return a.isNaN();
156 }
157}
158#endif // pRC_CORE_VALUE_BFLOAT16_H
Custom Type representing a half-precision floating point number.
Definition bfloat16.hpp:26
BFloat16(Float32 const single)
Definition bfloat16.hpp:49
constexpr auto & operator*=(X &&rhs) &
Definition bfloat16.hpp:118
constexpr auto & operator-=(X &&rhs) &
Definition bfloat16.hpp:112
constexpr BFloat16 & operator=(BFloat16 const &) &=default
constexpr auto operator==(BFloat16 const rhs)
Definition bfloat16.hpp:129
constexpr auto operator!=(BFloat16 const rhs)
Definition bfloat16.hpp:134
constexpr BFloat16(BFloat16 &&)=default
constexpr auto & operator+=(X &&rhs) &
Definition bfloat16.hpp:106
static constexpr auto FromRepresentation(Representation const rep)
Definition bfloat16.hpp:34
constexpr auto operator-() const
Definition bfloat16.hpp:144
constexpr BFloat16()=default
~BFloat16()=default
constexpr auto & operator/=(X &&rhs) &
Definition bfloat16.hpp:124
constexpr BFloat16(BFloat16 const &)=default
constexpr auto isNaN() const
Definition bfloat16.hpp:96
constexpr BFloat16 & operator=(BFloat16 &&) &=default
auto operator+() const
Definition bfloat16.hpp:139
Definition cholesky.hpp:18
static constexpr Conditional< IsSatisfied< C >, RemoveConstReference< X >, X > copy(X &&a)
Definition copy.hpp:13
static constexpr auto isnan(BFloat16 const a)
Definition bfloat16.hpp:153
#define BEGIN_IGNORE_DIAGNOSTIC_GCC(warning)
Definition pragma.hpp:42
#define END_IGNORE_DIAGNOSTIC_GCC
Definition pragma.hpp:43