36 #ifndef EIGEN_HALF_CUDA_H 37 #define EIGEN_HALF_CUDA_H 39 #if __cplusplus > 199711L 40 #define EIGEN_EXPLICIT_CAST(tgt_type) explicit operator tgt_type() 42 #define EIGEN_EXPLICIT_CAST(tgt_type) operator tgt_type() 52 #if !defined(EIGEN_HAS_CUDA_FP16) 57 explicit EIGEN_DEVICE_FUNC
__half(
unsigned short raw) :
x(raw) {}
77 #if !defined(EIGEN_HAS_CUDA_FP16) 81 EIGEN_DEVICE_FUNC
half() {}
83 EIGEN_DEVICE_FUNC
half(
const __half& h) : half_impl::half_base(h) {}
84 EIGEN_DEVICE_FUNC
half(
const half& h) : half_impl::half_base(h) {}
86 explicit EIGEN_DEVICE_FUNC
half(
bool b)
89 explicit EIGEN_DEVICE_FUNC
half(
const T& val)
91 explicit EIGEN_DEVICE_FUNC
half(
float f)
96 return (
x & 0x7fff) != 0;
126 return static_cast<unsigned long long>(
half_to_float(*
this));
141 namespace half_impl {
143 #if defined(EIGEN_HAS_CUDA_FP16) && defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 530 160 float num = __half2float(a);
161 float denom = __half2float(b);
162 return __float2half(num / denom);
202 #else // Emulate support for half floats 208 return half(
float(a) +
float(b));
211 return half(
float(a) *
float(b));
214 return half(
float(a) -
float(b));
217 return half(
float(a) /
float(b));
221 result.
x = a.
x ^ 0x8000;
225 a =
half(
float(a) +
float(b));
229 a =
half(
float(a) *
float(b));
233 a =
half(
float(a) -
float(b));
237 a =
half(
float(a) /
float(b));
241 return float(a) == float(b);
244 return float(a) != float(b);
247 return float(a) < float(b);
250 return float(a) <= float(b);
253 return float(a) > float(b);
256 return float(a) >= float(b);
259 #endif // Emulate support for half floats 264 return half(static_cast<float>(a) / static_cast<float>(b));
284 #if defined(EIGEN_HAS_CUDA_FP16) && defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 300 285 return __float2half(ff);
287 #elif defined(EIGEN_HAS_FP16_C) 289 h.
x = _cvtss_sh(ff, 0);
295 const FP32 f32infty = { 255 << 23 };
296 const FP32 f16max = { (127 + 16) << 23 };
297 const FP32 denorm_magic = { ((127 - 15) + (23 - 10) + 1) << 23 };
298 unsigned int sign_mask = 0x80000000u;
300 o.
x =
static_cast<unsigned short>(0x0u);
302 unsigned int sign = f.
u & sign_mask;
310 if (f.
u >= f16max.
u) {
311 o.
x = (f.
u > f32infty.
u) ? 0x7e00 : 0x7c00;
313 if (f.
u < (113 << 23)) {
317 f.
f += denorm_magic.
f;
320 o.
x =
static_cast<unsigned short>(f.
u - denorm_magic.
u);
322 unsigned int mant_odd = (f.
u >> 13) & 1;
325 f.
u += ((
unsigned int)(15 - 127) << 23) + 0xfff;
329 o.
x =
static_cast<unsigned short>(f.
u >> 13);
333 o.
x |=
static_cast<unsigned short>(sign >> 16);
339 #if defined(EIGEN_HAS_CUDA_FP16) && defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 300 340 return __half2float(h);
342 #elif defined(EIGEN_HAS_FP16_C) 343 return _cvtsh_ss(h.
x);
346 const FP32 magic = { 113 << 23 };
347 const unsigned int shifted_exp = 0x7c00 << 13;
350 o.
u = (h.
x & 0x7fff) << 13;
351 unsigned int exp = shifted_exp & o.
u;
352 o.
u += (127 - 15) << 23;
355 if (exp == shifted_exp) {
356 o.
u += (128 - 16) << 23;
357 }
else if (exp == 0) {
362 o.
u |= (h.
x & 0x8000) << 16;
370 return (a.
x & 0x7fff) == 0x7c00;
373 #if defined(EIGEN_HAS_CUDA_FP16) && defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 530 376 return (a.
x & 0x7fff) > 0x7c00;
385 result.
x = a.
x & 0x7FFF;
389 return half(::expf(
float(a)));
392 #if defined(EIGEN_HAS_CUDA_FP16) && defined __CUDACC_VER__ && __CUDACC_VER__ >= 80000 && defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 530 395 return half(::logf(
float(a)));
402 return half(::log10f(
float(a)));
405 return half(::sqrtf(
float(a)));
408 return half(::powf(
float(a),
float(b)));
411 return half(::sinf(
float(a)));
414 return half(::cosf(
float(a)));
417 return half(::tanf(
float(a)));
420 return half(::tanhf(
float(a)));
423 return half(::floorf(
float(a)));
426 return half(::ceilf(
float(a)));
430 #if defined(EIGEN_HAS_CUDA_FP16) && defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 530 431 return __hlt(b, a) ? b : a;
433 const float f1 =
static_cast<float>(a);
434 const float f2 =
static_cast<float>(
b);
435 return f2 < f1 ? b : a;
439 #if defined(EIGEN_HAS_CUDA_FP16) && defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 530 440 return __hlt(a, b) ? b : a;
442 const float f1 =
static_cast<float>(a);
443 const float f2 =
static_cast<float>(
b);
444 return f1 < f2 ? b : a;
449 os << static_cast<float>(v);
461 struct random_default_impl<
half, false, false>
465 return x + (y-
x) *
half(
float(std::rand()) / float(RAND_MAX));
481 struct numeric_limits<
Eigen::half> {
482 static const bool is_specialized =
true;
483 static const bool is_signed =
true;
485 static const bool is_exact =
false;
486 static const bool has_infinity =
true;
487 static const bool has_quiet_NaN =
true;
488 static const bool has_signaling_NaN =
true;
489 static const float_denorm_style has_denorm = denorm_present;
490 static const bool has_denorm_loss =
false;
491 static const std::float_round_style round_style = std::round_to_nearest;
492 static const bool is_iec559 =
false;
493 static const bool is_bounded =
false;
494 static const bool is_modulo =
false;
495 static const int digits = 11;
496 static const int digits10 = 2;
499 static const int min_exponent = -13;
500 static const int min_exponent10 = -4;
501 static const int max_exponent = 16;
502 static const int max_exponent10 = 4;
503 static const bool traps =
true;
504 static const bool tinyness_before =
false;
527 RequireInitialization =
false 553 result.
x = a.
x & 0x7FFF;
560 #if defined __CUDACC_VER__ && __CUDACC_VER__ >= 80000 && defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 530 581 #if __cplusplus > 199711L 583 struct hash<Eigen::half> {
585 return static_cast<std::size_t
>(a.
x);
594 #if defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 300 596 return static_cast<Eigen::half>(__shfl_xor(static_cast<float>(var), laneMask, width));
601 #if defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 350 604 __ldg(reinterpret_cast<const unsigned short*>(ptr)));
609 #if defined(__CUDA_ARCH__) 635 #endif // EIGEN_HALF_CUDA_H EIGEN_DEVICE_FUNC half_base(const __half &h)
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(double) const
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half() min(const half &a, const half &b)
#define EIGEN_ALWAYS_INLINE
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half log10(const half &a)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half logh(const Eigen::half &a)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool() isfinite(const half &a)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half pow(const half &a, const half &b)
#define EIGEN_STRONG_INLINE
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half powh(const Eigen::half &a, const Eigen::half &b)
#define EIGEN_NOT_A_MACRO
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half & operator*=(half &a, const half &b)
EIGEN_DEVICE_FUNC __half(unsigned short raw)
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(int) const
EIGEN_ALWAYS_INLINE std::ostream & operator<<(std::ostream &os, const half &v)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half & operator-=(half &a, const half &b)
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(short) const
static Eigen::half lowest()
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half exp(const half &a)
EIGEN_DEVICE_FUNC half(const T &val)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half sin(const half &a)
static int f(const TensorMap< Tensor< int, 3 > > &tensor)
EIGEN_DEVICE_FUNC half_base(const half_base &h)
static Eigen::half quiet_NaN()
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half abs(const half &a)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator-(const half &a, const half &b)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator>(const half &a, const half &b)
Holds information about the various numeric (i.e. scalar) types allowed by Eigen. ...
static half run(const half &x, const half &y)
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(unsigned long) const
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half infinity()
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator*(const half &a, const half &b)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator>=(const half &a, const half &b)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool() isinf(const half &a)
static Eigen::half epsilon()
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half sqrt(const half &a)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half() max(const half &a, const half &b)
static Eigen::half infinity()
EIGEN_DEVICE_FUNC half(bool b)
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half epsilon()
EIGEN_DEVICE_FUNC const SignReturnType sign() const
EIGEN_DEVICE_FUNC const Log1pReturnType log1p() const
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC __half float_to_half_rtne(float ff)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half ceilh(const Eigen::half &a)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half ceil(const half &a)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator/(const half &a, const half &b)
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half tan(const half &a)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator<=(const half &a, const half &b)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC float half_to_float(__half h)
EIGEN_DEVICE_FUNC half(const half &h)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator<(const half &a, const half &b)
EIGEN_DEVICE_FUNC half & operator=(const half &other)
static Eigen::half denorm_min()
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half floorh(const Eigen::half &a)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half & operator+=(half &a, const half &b)
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half quiet_NaN()
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half dummy_precision()
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(signed char) const
EIGEN_DEVICE_FUNC half_base()
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(unsigned long long) const
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half floor(const half &a)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half cos(const half &a)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC __half raw_uint16_to_half(unsigned short x)
static Eigen::half signaling_NaN()
EIGEN_DEVICE_FUNC __half()
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(unsigned char) const
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half tanh(const half &a)
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(long long) const
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(long) const
EIGEN_DEVICE_FUNC half(const __half &h)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator+(const half &a, const half &b)
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half highest()
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half exph(const Eigen::half &a)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half fabsh(const Eigen::half &a)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half log(const half &a)
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(unsigned short) const
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half lowest()
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool() isnan(const half &a)
static Eigen::half round_error()
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(unsigned int) const
void run(Expr &expr, Dev &dev)
EIGEN_DEVICE_FUNC const Scalar & b
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half & operator/=(half &a, const half &b)
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(float) const
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half log1p(const half &a)
EIGEN_DEVICE_FUNC half(float f)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half sqrth(const Eigen::half &a)
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(bool) const
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator==(const half &a, const half &b)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator!=(const half &a, const half &b)