29 #ifndef _HIP_BFLOAT16_H_ 
   30 #define _HIP_BFLOAT16_H_ 
   32 #if __cplusplus < 201103L || !defined(__HIPCC__) 
   51 #include <type_traits> 
   53 #pragma clang diagnostic push 
   54 #pragma clang diagnostic ignored "-Wshadow" 
   68         : 
data(float_to_bfloat16(f))
 
   72     explicit __host__ __device__ 
hip_bfloat16(
float f, truncate_t)
 
   73         : 
data(truncate_float_to_bfloat16(f))
 
   78     __host__ __device__ 
operator float()
 const 
   84         } u = {uint32_t(
data) << 16};
 
   88     static  __host__ __device__ 
hip_bfloat16 round_to_bfloat16(
float f)
 
   91         output.
data = float_to_bfloat16(f);
 
   95     static  __host__ __device__ 
hip_bfloat16 round_to_bfloat16(
float f, truncate_t)
 
   98         output.
data = truncate_float_to_bfloat16(f);
 
  103     static __host__ __device__ uint16_t float_to_bfloat16(
float f)
 
  110         if(~u.int32 & 0x7f800000)
 
  128             u.int32 += 0x7fff + ((u.int32 >> 16) & 1); 
 
  130         else if(u.int32 & 0xffff)
 
  142         return uint16_t(u.int32 >> 16);
 
  146     static __host__ __device__ uint16_t truncate_float_to_bfloat16(
float f)
 
  153         return uint16_t(u.int32 >> 16) | (!(~u.int32 & 0x7f800000) && (u.int32 & 0xffff));
 
  156 #pragma clang diagnostic pop 
  161 } hip_bfloat16_public;
 
  163 static_assert(std::is_standard_layout<hip_bfloat16>{},
 
  164               "hip_bfloat16 is not a standard layout type, and thus is " 
  165               "incompatible with C.");
 
  167 static_assert(std::is_trivial<hip_bfloat16>{},
 
  168               "hip_bfloat16 is not a trivial type, and thus is " 
  169               "incompatible with C.");
 
  171 static_assert(
sizeof(
hip_bfloat16) == 
sizeof(hip_bfloat16_public)
 
  172                   && offsetof(
hip_bfloat16, data) == offsetof(hip_bfloat16_public, data),
 
  173               "internal hip_bfloat16 does not match public hip_bfloat16");
 
  175 inline std::ostream& operator<<(std::ostream& os, 
const hip_bfloat16& bf16)
 
  177     return os << float(bf16);
 
  206     return float(a) < float(b);
 
  210     return float(a) == float(b);
 
  267     constexpr __host__ __device__ 
bool isinf(
hip_bfloat16 a)
 
  269         return !(~a.
data & 0x7f80) && !(a.
data & 0x7f);
 
  271     constexpr __host__ __device__ 
bool isnan(
hip_bfloat16 a)
 
  273         return !(~a.
data & 0x7f80) && +(a.
data & 0x7f);
 
  275     constexpr __host__ __device__ 
bool iszero(
hip_bfloat16 a)
 
  277         return !(a.
data & 0x7fff);
 
Struct to represent a 16 bit brain floating point number.
Definition: hip_bfloat16.h:40
 
uint16_t data
Definition: hip_bfloat16.h:41