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) 56 explicit EIGEN_DEVICE_FUNC
__half_raw(
unsigned short raw) :
x(raw) {}
59 #elif defined(EIGEN_CUDACC_VER) && EIGEN_CUDACC_VER < 90000 71 EIGEN_DEVICE_FUNC
half_base(
const __half_raw&
h) : __half_raw(h) {}
72 #if defined(EIGEN_HAS_CUDA_FP16) && defined(EIGEN_CUDACC_VER) && EIGEN_CUDACC_VER >= 90000 81 #if !defined(EIGEN_HAS_CUDA_FP16) || (defined(EIGEN_CUDACC_VER) && EIGEN_CUDACC_VER < 90000) 85 EIGEN_DEVICE_FUNC
half() {}
87 EIGEN_DEVICE_FUNC
half(
const __half_raw&
h) : half_impl::half_base(h) {}
88 EIGEN_DEVICE_FUNC
half(
const half&
h) : half_impl::half_base(h) {}
89 #if defined(EIGEN_HAS_CUDA_FP16) && defined(EIGEN_CUDACC_VER) && EIGEN_CUDACC_VER >= 90000 93 explicit EIGEN_DEVICE_FUNC
half(
bool b)
96 explicit EIGEN_DEVICE_FUNC
half(
const T& val)
98 explicit EIGEN_DEVICE_FUNC
half(
float f)
103 return (
x & 0x7fff) != 0;
133 return static_cast<unsigned long long>(
half_to_float(*
this));
152 struct numeric_limits<
Eigen::half> {
153 static const bool is_specialized =
true;
154 static const bool is_signed =
true;
155 static const bool is_integer =
false;
156 static const bool is_exact =
false;
157 static const bool has_infinity =
true;
158 static const bool has_quiet_NaN =
true;
159 static const bool has_signaling_NaN =
true;
160 static const float_denorm_style has_denorm = denorm_present;
161 static const bool has_denorm_loss =
false;
162 static const std::float_round_style round_style = std::round_to_nearest;
163 static const bool is_iec559 =
false;
164 static const bool is_bounded =
false;
165 static const bool is_modulo =
false;
166 static const int digits = 11;
167 static const int digits10 = 3;
168 static const int max_digits10 = 5;
170 static const int min_exponent = -13;
171 static const int min_exponent10 = -4;
172 static const int max_exponent = 16;
173 static const int max_exponent10 = 4;
174 static const bool traps =
true;
175 static const bool tinyness_before =
false;
193 struct numeric_limits<const
Eigen::half> : numeric_limits<Eigen::half> {};
195 struct numeric_limits<volatile Eigen::half> : numeric_limits<Eigen::half> {};
197 struct numeric_limits<const volatile Eigen::half> : numeric_limits<Eigen::half> {};
202 namespace half_impl {
204 #if defined(EIGEN_HAS_CUDA_FP16) && defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 530 221 float num = __half2float(a);
222 float denom = __half2float(b);
223 return __float2half(num / denom);
263 #else // Emulate support for half floats 269 return half(
float(a) +
float(b));
272 return half(
float(a) *
float(b));
275 return half(
float(a) -
float(b));
278 return half(
float(a) /
float(b));
282 result.
x = a.
x ^ 0x8000;
286 a =
half(
float(a) +
float(b));
290 a =
half(
float(a) *
float(b));
294 a =
half(
float(a) -
float(b));
298 a =
half(
float(a) /
float(b));
320 #endif // Emulate support for half floats 325 return half(static_cast<float>(a) / static_cast<float>(b));
345 #if defined(EIGEN_HAS_CUDA_FP16) && defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 300 346 __half tmp_ff = __float2half(ff);
349 #elif defined(EIGEN_HAS_FP16_C) 351 h.
x = _cvtss_sh(ff, 0);
359 const float32_bits denorm_magic = { ((127 - 15) + (23 - 10) + 1) << 23 };
360 unsigned int sign_mask = 0x80000000u;
362 o.
x =
static_cast<unsigned short>(0x0u);
364 unsigned int sign = f.
u & sign_mask;
372 if (f.
u >= f16max.
u) {
373 o.
x = (f.
u > f32infty.
u) ? 0x7e00 : 0x7c00;
375 if (f.
u < (113 << 23)) {
379 f.
f += denorm_magic.
f;
382 o.
x =
static_cast<unsigned short>(f.
u - denorm_magic.
u);
384 unsigned int mant_odd = (f.
u >> 13) & 1;
387 f.
u += ((
unsigned int)(15 - 127) << 23) + 0xfff;
391 o.
x =
static_cast<unsigned short>(f.
u >> 13);
395 o.
x |=
static_cast<unsigned short>(sign >> 16);
401 #if defined(EIGEN_HAS_CUDA_FP16) && defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 300 402 return __half2float(h);
404 #elif defined(EIGEN_HAS_FP16_C) 405 return _cvtsh_ss(h.
x);
409 const unsigned int shifted_exp = 0x7c00 << 13;
412 o.
u = (h.
x & 0x7fff) << 13;
413 unsigned int exp = shifted_exp & o.
u;
414 o.
u += (127 - 15) << 23;
417 if (exp == shifted_exp) {
418 o.
u += (128 - 16) << 23;
419 }
else if (exp == 0) {
424 o.
u |= (h.
x & 0x8000) << 16;
432 return (a.x & 0x7fff) == 0x7c00;
435 #if defined(EIGEN_HAS_CUDA_FP16) && defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 530 438 return (a.x & 0x7fff) > 0x7c00;
447 result.
x = a.
x & 0x7FFF;
451 #if EIGEN_CUDACC_VER >= 80000 && defined EIGEN_CUDA_ARCH && EIGEN_CUDA_ARCH >= 530 452 return half(hexp(a));
454 return half(::expf(
float(a)));
458 #if defined(EIGEN_HAS_CUDA_FP16) && EIGEN_CUDACC_VER >= 80000 && defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 530 459 return half(::hlog(a));
461 return half(::logf(
float(a)));
468 return half(::log10f(
float(a)));
471 #if EIGEN_CUDACC_VER >= 80000 && defined EIGEN_CUDA_ARCH && EIGEN_CUDA_ARCH >= 530 472 return half(hsqrt(a));
474 return half(::sqrtf(
float(a)));
478 return half(::powf(
float(a),
float(b)));
481 return half(::sinf(
float(a)));
484 return half(::cosf(
float(a)));
487 return half(::tanf(
float(a)));
490 return half(::tanhf(
float(a)));
493 #if EIGEN_CUDACC_VER >= 80000 && defined EIGEN_CUDA_ARCH && EIGEN_CUDA_ARCH >= 300 494 return half(hfloor(a));
496 return half(::floorf(
float(a)));
500 #if EIGEN_CUDACC_VER >= 80000 && defined EIGEN_CUDA_ARCH && EIGEN_CUDA_ARCH >= 300 501 return half(hceil(a));
503 return half(::ceilf(
float(a)));
508 #if defined(EIGEN_HAS_CUDA_FP16) && defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 530 509 return __hlt(b, a) ? b :
a;
511 const float f1 =
static_cast<float>(
a);
512 const float f2 =
static_cast<float>(
b);
513 return f2 < f1 ? b :
a;
517 #if defined(EIGEN_HAS_CUDA_FP16) && defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 530 518 return __hlt(a, b) ? b :
a;
520 const float f1 =
static_cast<float>(
a);
521 const float f2 =
static_cast<float>(
b);
522 return f1 < f2 ? b :
a;
527 os << static_cast<float>(
v);
543 return x + (y-
x) *
half(
float(std::rand()) /
float(RAND_MAX));
562 RequireInitialization =
false 588 result.
x = a.
x & 0x7FFF;
595 #if EIGEN_CUDACC_VER >= 80000 && defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 530 616 #if __cplusplus > 199711L 618 struct hash<Eigen::half> {
629 #if defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 300 631 #if EIGEN_CUDACC_VER < 90000 632 return static_cast<Eigen::half>(__shfl_xor(static_cast<float>(var), laneMask, width));
634 return static_cast<Eigen::half>(__shfl_xor_sync(0xFFFFFFFF, static_cast<float>(var), laneMask, width));
640 #if defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 350 643 __ldg(reinterpret_cast<const unsigned short*>(ptr)));
648 #if defined(EIGEN_CUDA_ARCH) 674 #endif // EIGEN_HALF_CUDA_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 float half_to_float(__half_raw h)
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 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)
EIGEN_DEVICE_FUNC half_base(const half_base &h)
static Eigen::half quiet_NaN()
Namespace containing all symbols from the Eigen library.
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
double f2(const Vector2 &x)
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)
EIGEN_DEVICE_FUNC __half_raw(unsigned short raw)
static Eigen::half epsilon()
EIGEN_DEVICE_FUNC half(const __half_raw &h)
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)
EIGEN_DEVICE_FUNC __half_raw()
static Eigen::half infinity()
EIGEN_DEVICE_FUNC half(bool b)
EIGEN_STRONG_INLINE bool not_equal_strict(const X &x, const Y &y)
EIGEN_STRONG_INLINE bool equal_strict(const X &x, const Y &y)
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 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)
Point2(* f)(const Point3 &, OptionalJacobian< 2, 3 >)
Array< double, 1, 3 > e(1./3., 0.5, 2.)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator<=(const half &a, const half &b)
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()
ofstream os("timeSchurFactors.csv")
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(unsigned long long) const
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half floor(const half &a)
EIGEN_DEVICE_FUNC half_base(const __half_raw &h)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half cos(const half &a)
Point2 f1(const Point3 &p, OptionalJacobian< 2, 3 > H)
static Eigen::half signaling_NaN()
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(unsigned char) const
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half tanh(const half &a)
half_impl::__half_raw __half_raw
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(long long) const
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(long) const
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_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 __half_raw float_to_half_rtne(float ff)
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)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC __half_raw raw_uint16_to_half(unsigned short x)