diff options
author | Gael Guennebaud <g.gael@free.fr> | 2009-03-26 12:50:24 +0000 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2009-03-26 12:50:24 +0000 |
commit | ce5669dbf9d3ed3502531a73b43184859d5881d2 (patch) | |
tree | 43f47cf897790e544bf579b6571608da840cfcb3 /Eigen/src/Core/util | |
parent | 62de40f8bb82bae0abeb8978d29725d0e3c8939e (diff) |
* enable vectorization of sin, cos, etc. by default with an option to
disable them (-DEIGEN_FAST_MATH=0)
* add a specialization of MatrixBase::operator*(RealScalar) for fast
"matrix of complex" times scalar products (even more useful for
autodiff scalar types)
Diffstat (limited to 'Eigen/src/Core/util')
-rw-r--r-- | Eigen/src/Core/util/ForwardDeclarations.h | 2 | ||||
-rw-r--r-- | Eigen/src/Core/util/Macros.h | 17 | ||||
-rw-r--r-- | Eigen/src/Core/util/Meta.h | 8 | ||||
-rw-r--r-- | Eigen/src/Core/util/XprHelper.h | 22 |
4 files changed, 45 insertions, 4 deletions
diff --git a/Eigen/src/Core/util/ForwardDeclarations.h b/Eigen/src/Core/util/ForwardDeclarations.h index ae079a29a..59205ce2e 100644 --- a/Eigen/src/Core/util/ForwardDeclarations.h +++ b/Eigen/src/Core/util/ForwardDeclarations.h @@ -90,6 +90,8 @@ template<typename Scalar> struct ei_scalar_add_op; template<typename Scalar> struct ei_scalar_constant_op; template<typename Scalar> struct ei_scalar_identity_op; +template<typename Scalar1,typename Scalar2> struct ei_scalar_multiple2_op; + struct IOFormat; template<typename Scalar> diff --git a/Eigen/src/Core/util/Macros.h b/Eigen/src/Core/util/Macros.h index 69fa1db18..43c66d980 100644 --- a/Eigen/src/Core/util/Macros.h +++ b/Eigen/src/Core/util/Macros.h @@ -60,15 +60,15 @@ #define EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ColMajor #endif -/** \internal Defines the maximal loop size to enable meta unrolling of loops. - * Note that the value here is expressed in Eigen's own notion of "number of FLOPS", - * it does not correspond to the number of iterations or the number of instructions +/** Defines the maximal loop size to enable meta unrolling of loops. + * Note that the value here is expressed in Eigen's own notion of "number of FLOPS", + * it does not correspond to the number of iterations or the number of instructions */ #ifndef EIGEN_UNROLLING_LIMIT #define EIGEN_UNROLLING_LIMIT 100 #endif -/** \internal Define the maximal size in Bytes of blocks fitting in CPU cache. +/** Defines the maximal size in Bytes of blocks fitting in CPU cache. * The current value is set to generate blocks of 256x256 for float * * Typically for a single-threaded application you would set that to 25% of the size of your CPU caches in bytes @@ -82,6 +82,15 @@ #error EIGEN_TUNE_FOR_L2_CACHE_SIZE is now called EIGEN_TUNE_FOR_CPU_CACHE_SIZE. #endif +/** Allows to disable some optimizations which might affect the accuracy of the result. + * Such optimization are enabled by default, and set EIGEN_FAST_MATH to 0 to disable them. + * They currently include: + * - single precision Cwise::sin() and Cwise::cos() when SSE vectorization is enabled. + */ +#ifndef EIGEN_FAST_MATH +#define EIGEN_FAST_MATH 1 +#endif + #define USING_PART_OF_NAMESPACE_EIGEN \ EIGEN_USING_MATRIX_TYPEDEFS \ using Eigen::Matrix; \ diff --git a/Eigen/src/Core/util/Meta.h b/Eigen/src/Core/util/Meta.h index c65c52ef4..120cde3e0 100644 --- a/Eigen/src/Core/util/Meta.h +++ b/Eigen/src/Core/util/Meta.h @@ -64,6 +64,14 @@ template<typename T> struct ei_cleantype<T&> { typedef typename ei_cleant template<typename T> struct ei_cleantype<const T*> { typedef typename ei_cleantype<T>::type type; }; template<typename T> struct ei_cleantype<T*> { typedef typename ei_cleantype<T>::type type; }; +/** \internal Allows to enable/disable an overload + * according to a compile time condition. + */ +template<bool Condition, typename T> struct ei_enable_if; + +template<typename T> struct ei_enable_if<true,T> +{ typedef T type; }; + /** \internal * Convenient struct to get the result type of a unary or binary functor. * diff --git a/Eigen/src/Core/util/XprHelper.h b/Eigen/src/Core/util/XprHelper.h index 60d686949..d78e3ea8c 100644 --- a/Eigen/src/Core/util/XprHelper.h +++ b/Eigen/src/Core/util/XprHelper.h @@ -198,6 +198,28 @@ template<unsigned int Flags> struct ei_are_flags_consistent }; }; +/** \internal Helper base class to add a scalar multiple operator + * overloads for complex types */ +template<typename Derived,typename Scalar,typename OtherScalar, + bool EnableIt = !ei_is_same_type<Scalar,OtherScalar>::ret > +struct ei_special_scalar_op_base +{ + // dummy operator* so that the + // "using ei_special_scalar_op_base::operator*" compiles + void operator*() const; +}; + +template<typename Derived,typename Scalar,typename OtherScalar> +struct ei_special_scalar_op_base<Derived,Scalar,OtherScalar,true> +{ + const CwiseUnaryOp<ei_scalar_multiple2_op<Scalar,OtherScalar>, Derived> + operator*(const OtherScalar& scalar) const + { + return CwiseUnaryOp<ei_scalar_multiple2_op<Scalar,OtherScalar>, Derived> + (*static_cast<const Derived*>(this), ei_scalar_multiple2_op<Scalar,OtherScalar>(scalar)); + } +}; + /** \internal Gives the type of a sub-matrix or sub-vector of a matrix of type \a ExpressionType and size \a Size * TODO: could be a good idea to define a big ReturnType struct ?? */ |