aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2009-01-08 10:36:54 +0000
committerGravatar Gael Guennebaud <g.gael@free.fr>2009-01-08 10:36:54 +0000
commit4432cf8ca327d6af820d0e410ebcfcf14611a6c6 (patch)
treea937ae9c974ac90a110c6653a2fe5f8e71dc820e
parentcb71dc4bbfe3c4dd49603872a960aff1a841e561 (diff)
bugfix in sum
-rw-r--r--Eigen/src/Core/Sum.h13
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;
}
};