std::numeric_limits doesn't work reliably on CUDA devices. Use our own definition of numeric_limit<T>::max() and numeric_limit<T>::min() instead of the stl ones.

This commit is contained in:
Benoit Steiner
2015-08-21 16:01:40 -07:00
parent e5c78d85c8
commit a09cfe650f
2 changed files with 55 additions and 2 deletions

View File

@@ -83,8 +83,24 @@ template<typename T> struct GenericNumTraits
// make sure to override this for floating-point types
return Real(0);
}
static inline T highest() { return (std::numeric_limits<T>::max)(); }
static inline T lowest() { return IsInteger ? (std::numeric_limits<T>::min)() : (-(std::numeric_limits<T>::max)()); }
EIGEN_DEVICE_FUNC
static inline T highest() {
#if defined(__CUDA_ARCH__)
return internal::device::numeric_limits<T>::max();
#else
return (std::numeric_limits<T>::max)();
#endif
}
EIGEN_DEVICE_FUNC
static inline T lowest() {
#if defined(__CUDA_ARCH__)
return IsInteger ? (internal::device::numeric_limits<T>::min)() : (-(internal::device::numeric_limits<T>::max)());
#else
return IsInteger ? (std::numeric_limits<T>::min)() : (-(std::numeric_limits<T>::max)());
#endif
};
template<typename T> struct NumTraits : GenericNumTraits<T>