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

@@ -128,16 +128,53 @@ template<typename T> struct numeric_limits
{
EIGEN_DEVICE_FUNC
static T epsilon() { return 0; }
static T max() { assert(false && "Highest not suppoted for this type"); }
static T min() { assert(false && "Lowest not suppoted for this type"); }
};
template<> struct numeric_limits<float>
{
EIGEN_DEVICE_FUNC
static float epsilon() { return __FLT_EPSILON__; }
EIGEN_DEVICE_FUNC
static float max() { return CUDART_MAX_NORMAL_F; }
EIGEN_DEVICE_FUNC
static float min() { return __FLT_EPSILON__; }
};
template<> struct numeric_limits<double>
{
EIGEN_DEVICE_FUNC
static double epsilon() { return __DBL_EPSILON__; }
EIGEN_DEVICE_FUNC
static double max() { return CUDART_INF; }
EIGEN_DEVICE_FUNC
static double min() { return __DBL_EPSILON__; }
};
template<> struct numeric_limits<int>
{
EIGEN_DEVICE_FUNC
static int epsilon() { return 0; }
EIGEN_DEVICE_FUNC
static int max() { return INT_MAX; }
EIGEN_DEVICE_FUNC
static int min() { return INT_MIN; }
};
template<> struct numeric_limits<long>
{
EIGEN_DEVICE_FUNC
static long epsilon() { return 0; }
EIGEN_DEVICE_FUNC
static long max() { return LONG_MAX; }
EIGEN_DEVICE_FUNC
static long min() { return LONG_MIN; }
};
template<> struct numeric_limits<long long>
{
EIGEN_DEVICE_FUNC
static long long epsilon() { return 0; }
EIGEN_DEVICE_FUNC
static long long max() { return LLONG_MAX; }
EIGEN_DEVICE_FUNC
static long long min() { return LLONG_MIN; }
};
}