diff options
author | Gael Guennebaud <g.gael@free.fr> | 2009-01-08 10:36:54 +0000 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2009-01-08 10:36:54 +0000 |
commit | 4432cf8ca327d6af820d0e410ebcfcf14611a6c6 (patch) | |
tree | a937ae9c974ac90a110c6653a2fe5f8e71dc820e | |
parent | cb71dc4bbfe3c4dd49603872a960aff1a841e561 (diff) |
bugfix in sum
-rw-r--r-- | Eigen/src/Core/Sum.h | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/Eigen/src/Core/Sum.h b/Eigen/src/Core/Sum.h index 33aa60956..ab9cdad1f 100644 --- a/Eigen/src/Core/Sum.h +++ b/Eigen/src/Core/Sum.h @@ -231,11 +231,18 @@ template<typename Derived> struct ei_sum_impl<Derived, LinearVectorization, CompleteUnrolling, IsDense> { typedef typename Derived::Scalar Scalar; + typedef typename ei_packet_traits<Scalar>::type PacketScalar; + enum { + PacketSize = ei_packet_traits<Scalar>::size, + Size = Derived::SizeAtCompileTime, + VectorizationSize = (Size / PacketSize) * PacketSize + }; static Scalar run(const Derived& mat) { - return ei_predux( - ei_sum_vec_unroller<Derived, 0, Derived::SizeAtCompileTime>::run(mat) - ); + Scalar res = ei_predux(ei_sum_vec_unroller<Derived, 0, VectorizationSize>::run(mat)); + if (VectorizationSize != Size) + res += ei_sum_novec_unroller<Derived, VectorizationSize, Size-VectorizationSize>::run(mat); + return res; } }; |