diff options
author | Benoit Steiner <benoit.steiner.goog@gmail.com> | 2016-03-25 11:02:56 -0700 |
---|---|---|
committer | Benoit Steiner <benoit.steiner.goog@gmail.com> | 2016-03-25 11:02:56 -0700 |
commit | d94f6ba9659f8c953caaff854552070ce149958b (patch) | |
tree | 0f48a08cae1d45e17b3e198c3086d82020454245 /Eigen/src/Core/NumTraits.h | |
parent | a86c9f037b24312863ad2a74a583369581c6e21a (diff) |
Started to model the cost of divisions more accurately.
Diffstat (limited to 'Eigen/src/Core/NumTraits.h')
-rw-r--r-- | Eigen/src/Core/NumTraits.h | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/Eigen/src/Core/NumTraits.h b/Eigen/src/Core/NumTraits.h index 7ddb4a867..b7b5e7d22 100644 --- a/Eigen/src/Core/NumTraits.h +++ b/Eigen/src/Core/NumTraits.h @@ -60,6 +60,23 @@ template<typename T> struct GenericNumTraits MulCost = 1 }; + // Division is messy but important, because it is expensive and throughput + // varies significantly. The following numbers are based on min division + // throughput on Haswell. + template<bool Vectorized> + struct Div { + enum { +#ifdef EIGEN_VECTORIZE_AVX + AVX = true, +#else + AVX = false, +#endif + Cost = IsInteger ? (sizeof(T) == 8 ? (IsSigned ? 24 : 21) : (IsSigned ? 8 : 9)): + Vectorized ? (sizeof(T) == 8 ? (AVX ? 16 : 8) : (AVX ? 14 : 7)) : 8 + }; + }; + + typedef T Real; typedef typename internal::conditional< IsInteger, |