27 #ifndef MSHADOW_BFLOAT_H_ 28 #define MSHADOW_BFLOAT_H_ 36 #define MSHADOW_BF16_OPERATOR_TYPE(RTYPE, ITYPE, OP) \ 37 MSHADOW_XINLINE RTYPE operator OP (ITYPE a, bf16_t b) { \ 38 return RTYPE(a OP float(b)); \ 40 MSHADOW_XINLINE RTYPE operator OP (bf16_t a, ITYPE b) { \ 41 return RTYPE(float(a) OP b); \ 44 #define MSHADOW_BF16_OPERATOR(RTYPE, OP) \ 45 MSHADOW_XINLINE RTYPE operator OP (bf16_t a, bf16_t b) { \ 46 return RTYPE(static_cast<float>(a) OP float(b)); \ 48 MSHADOW_BF16_OPERATOR_TYPE(float, float, OP) \ 49 MSHADOW_BF16_OPERATOR_TYPE(double, double, OP) \ 50 MSHADOW_BF16_OPERATOR_TYPE(float, int8_t, OP) \ 51 MSHADOW_BF16_OPERATOR_TYPE(float, uint8_t, OP) \ 52 MSHADOW_BF16_OPERATOR_TYPE(float, int32_t, OP) \ 53 MSHADOW_BF16_OPERATOR_TYPE(float, uint32_t, OP) \ 54 MSHADOW_BF16_OPERATOR_TYPE(float, int64_t, OP) \ 55 MSHADOW_BF16_OPERATOR_TYPE(float, uint64_t, OP) 57 #define MSHADOW_BF16_ASSIGNOP(AOP, OP) \ 58 template<typename T> \ 59 MSHADOW_XINLINE bf16_t operator AOP (const T& a) { \ 60 return *this = bf16_t(float(*this) OP float(a)); \ 62 template<typename T> \ 63 MSHADOW_XINLINE bf16_t operator AOP (const volatile T& a) volatile { \ 64 return *this = bf16_t(float(*this) OP float(a)); \ 67 #define MSHADOW_BF16_CONVERSIONOP(T) \ 68 MSHADOW_XINLINE operator T() const { \ 69 return T(BF16ToFloat(bf16_)); \ 71 MSHADOW_XINLINE operator T() const volatile { \ 72 return T(BF16ToFloat(bf16_)); \ 88 MSHADOW_XINLINE explicit bf16_t(
const double& value) { constructor(value); }
89 MSHADOW_XINLINE explicit bf16_t(
const int8_t& value) { constructor(value); }
90 MSHADOW_XINLINE explicit bf16_t(
const uint8_t& value) { constructor(value); }
91 MSHADOW_XINLINE explicit bf16_t(
const int32_t& value) { constructor(value); }
92 MSHADOW_XINLINE explicit bf16_t(
const uint32_t& value) { constructor(value); }
93 MSHADOW_XINLINE explicit bf16_t(
const int64_t& value) { constructor(value); }
94 MSHADOW_XINLINE explicit bf16_t(
const uint64_t& value) { constructor(value); }
108 return bf16_t(-
float(*
this));
118 return *
this = bf16_t(a);
128 return *
this = bf16_t(a);
139 return reinterpret_cast<const uint16_t*
>(&value)[1];
143 MSHADOW_XINLINE uint16_t FloatToBF16(
const volatile float& value)
const volatile {
144 return reinterpret_cast<const volatile uint16_t*
>(&value)[1];
149 reinterpret_cast<uint16_t*
>(&ret)[1] = value;
153 MSHADOW_XINLINE float BF16ToFloat(
const volatile uint16_t& value)
const volatile {
155 reinterpret_cast<uint16_t*
>(&ret)[1] = value;
161 bf16_ = FloatToBF16(
float(value));
182 #define MSHADOW_BF16_MIN mshadow::bfloat::bf16_t::Binary(0xFF7F); 183 #define MSHADOW_BF16_MAX mshadow::bfloat::bf16_t::Binary(0x7F7F); 186 #endif // MSHADOW_BFLOAT_H_ BinaryMapExp< op::minus, TA, ScalarExp< MSHADOW_SCALAR_ >, MSHADOW_SCALAR_,(ta|type::kMapper)> operator-(const Exp< TA, MSHADOW_SCALAR_, ta > &lhs, const ScalarExp< MSHADOW_SCALAR_ > &rhs)
operator overload
Definition: expr_scalar-inl.h:102
BinaryMapExp< op::plus, TA, ScalarExp< MSHADOW_SCALAR_ >, MSHADOW_SCALAR_,(ta|type::kMapper)> operator+(const Exp< TA, MSHADOW_SCALAR_, ta > &lhs, const ScalarExp< MSHADOW_SCALAR_ > &rhs)
operator overload
Definition: expr_scalar-inl.h:94
#define MSHADOW_BF16_ASSIGNOP(AOP, OP)
Definition: bfloat.h:57
#define MSHADOW_XINLINE
Definition: base.h:223
#define MSHADOW_BF16_CONVERSIONOP(T)
Definition: bfloat.h:67
#define MSHADOW_BF16_OPERATOR(RTYPE, OP)
Definition: bfloat.h:44
class MSHADOW_ALIGNED(2) bf16_t
Definition: bfloat.h:75
overloaded + operator between half_t and bf16_t
Definition: base.h:327