diff options
author | Antonio Sanchez <cantonios@google.com> | 2021-02-19 08:52:31 -0800 |
---|---|---|
committer | Rasmus Munk Larsen <rmlarsen@google.com> | 2021-02-24 00:16:31 +0000 |
commit | db5691ff2b537ef003b192b5cbd871f0eb9309ba (patch) | |
tree | 90c6b8faf224d63ea8b7f692ecb5b0bf789b95db /Eigen/src/Core/arch/Default/Half.h | |
parent | 88d4c6d4c870f53d129ab5f8b43e01812d9b500e (diff) |
Fix some CUDA warnings.
Added `EIGEN_HAS_STD_HASH` macro, checking for C++11 support and not
running on GPU.
`std::hash<float>` is not a device function, so cannot be used by
`std::hash<bfloat16>`. Removed `EIGEN_DEVICE_FUNC` and only
define if `EIGEN_HAS_STD_HASH`. Same for `half`.
Added `EIGEN_CUDA_HAS_FP16_ARITHMETIC` to improve readability,
eliminate warnings about `EIGEN_CUDA_ARCH` not being defined.
Replaced a couple C-style casts with `reinterpret_cast` for aligned
loading of `half*` to `half2*`. This eliminates `-Wcast-align`
warnings in clang. Although not ideal due to potential type aliasing,
this is how CUDA handles these conversions internally.
Diffstat (limited to 'Eigen/src/Core/arch/Default/Half.h')
-rw-r--r-- | Eigen/src/Core/arch/Default/Half.h | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/Eigen/src/Core/arch/Default/Half.h b/Eigen/src/Core/arch/Default/Half.h index b273abe7e..c91b0ce2f 100644 --- a/Eigen/src/Core/arch/Default/Half.h +++ b/Eigen/src/Core/arch/Default/Half.h @@ -757,19 +757,6 @@ template<> struct NumTraits<Eigen::half> #pragma pop_macro("EIGEN_CONSTEXPR") #endif -namespace std { - -#if __cplusplus > 199711L -template <> -struct hash<Eigen::half> { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::size_t operator()(const Eigen::half& a) const { - return static_cast<std::size_t>(a.x); - } -}; -#endif - -} // end namespace std - namespace Eigen { namespace numext { @@ -870,4 +857,15 @@ EIGEN_STRONG_INLINE __device__ Eigen::half __ldg(const Eigen::half* ptr) { } #endif // __ldg +#if EIGEN_HAS_STD_HASH +namespace std { +template <> +struct hash<Eigen::half> { + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::size_t operator()(const Eigen::half& a) const { + return static_cast<std::size_t>(Eigen::numext::bit_cast<Eigen::numext::uint16_t>(a)); + } +}; +} // end namespace std +#endif + #endif // EIGEN_HALF_H |