Fix vectorization logic wrt assignment functors

This commit is contained in:
Gael Guennebaud 2014-02-19 13:26:07 +01:00
parent 3a735a6cf1
commit 68e8ddaf94
2 changed files with 10 additions and 9 deletions

View File

@ -24,7 +24,7 @@ namespace internal {
// copy_using_evaluator_traits is based on assign_traits // copy_using_evaluator_traits is based on assign_traits
template <typename Derived, typename OtherDerived> template <typename Derived, typename OtherDerived, typename AssignFunc>
struct copy_using_evaluator_traits struct copy_using_evaluator_traits
{ {
public: public:
@ -50,7 +50,8 @@ private:
enum { enum {
StorageOrdersAgree = (int(Derived::IsRowMajor) == int(OtherDerived::IsRowMajor)), StorageOrdersAgree = (int(Derived::IsRowMajor) == int(OtherDerived::IsRowMajor)),
MightVectorize = StorageOrdersAgree MightVectorize = StorageOrdersAgree
&& (int(Derived::Flags) & int(OtherDerived::Flags) & ActualPacketAccessBit), && (int(Derived::Flags) & int(OtherDerived::Flags) & ActualPacketAccessBit)
&& (functor_traits<AssignFunc>::PacketAccess),
MayInnerVectorize = MightVectorize && int(InnerSize)!=Dynamic && int(InnerSize)%int(PacketSize)==0 MayInnerVectorize = MightVectorize && int(InnerSize)!=Dynamic && int(InnerSize)%int(PacketSize)==0
&& int(DstIsAligned) && int(SrcIsAligned), && int(DstIsAligned) && int(SrcIsAligned),
MayLinearize = StorageOrdersAgree && (int(Derived::Flags) & int(OtherDerived::Flags) & LinearAccessBit), MayLinearize = StorageOrdersAgree && (int(Derived::Flags) & int(OtherDerived::Flags) & LinearAccessBit),
@ -517,7 +518,7 @@ public:
typedef SrcEvaluatorTypeT SrcEvaluatorType; typedef SrcEvaluatorTypeT SrcEvaluatorType;
typedef typename DstEvaluatorType::Scalar Scalar; typedef typename DstEvaluatorType::Scalar Scalar;
typedef typename DstEvaluatorType::Index Index; typedef typename DstEvaluatorType::Index Index;
typedef copy_using_evaluator_traits<DstXprType, SrcXprType> AssignmentTraits; typedef copy_using_evaluator_traits<DstXprType, SrcXprType, Functor> AssignmentTraits;
generic_dense_assignment_kernel(DstEvaluatorType &dst, const SrcEvaluatorType &src, const Functor &func, DstXprType& dstExpr) generic_dense_assignment_kernel(DstEvaluatorType &dst, const SrcEvaluatorType &src, const Functor &func, DstXprType& dstExpr)
@ -613,7 +614,7 @@ void call_dense_assignment_loop(const DstXprType& dst, const SrcXprType& src, co
{ {
#ifdef EIGEN_DEBUG_ASSIGN #ifdef EIGEN_DEBUG_ASSIGN
// TODO these traits should be computed from information provided by the evaluators // TODO these traits should be computed from information provided by the evaluators
internal::copy_using_evaluator_traits<DstXprType, SrcXprType>::debug(); internal::copy_using_evaluator_traits<DstXprType, SrcXprType, Functor>::debug();
#endif #endif
eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols());
@ -750,7 +751,7 @@ struct Assignment<DstXprType, SrcXprType, Functor, Dense2Dense, Scalar>
eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols());
#ifdef EIGEN_DEBUG_ASSIGN #ifdef EIGEN_DEBUG_ASSIGN
internal::copy_using_evaluator_traits<DstXprType, SrcXprType>::debug(); internal::copy_using_evaluator_traits<DstXprType, SrcXprType, Functor>::debug();
#endif #endif
call_dense_assignment_loop(dst, src, func); call_dense_assignment_loop(dst, src, func);

View File

@ -31,7 +31,7 @@ template<typename Scalar>
struct functor_traits<assign_op<Scalar> > { struct functor_traits<assign_op<Scalar> > {
enum { enum {
Cost = NumTraits<Scalar>::ReadCost, Cost = NumTraits<Scalar>::ReadCost,
PacketAccess = packet_traits<Scalar>::IsVectorized PacketAccess = packet_traits<Scalar>::Vectorizable
}; };
}; };
@ -73,7 +73,7 @@ template<typename Scalar>
struct functor_traits<sub_assign_op<Scalar> > { struct functor_traits<sub_assign_op<Scalar> > {
enum { enum {
Cost = NumTraits<Scalar>::ReadCost + NumTraits<Scalar>::AddCost, Cost = NumTraits<Scalar>::ReadCost + NumTraits<Scalar>::AddCost,
PacketAccess = packet_traits<Scalar>::HasAdd PacketAccess = packet_traits<Scalar>::HasSub
}; };
}; };
@ -115,7 +115,7 @@ template<typename Scalar>
struct functor_traits<div_assign_op<Scalar> > { struct functor_traits<div_assign_op<Scalar> > {
enum { enum {
Cost = NumTraits<Scalar>::ReadCost + NumTraits<Scalar>::MulCost, Cost = NumTraits<Scalar>::ReadCost + NumTraits<Scalar>::MulCost,
PacketAccess = packet_traits<Scalar>::HasMul PacketAccess = packet_traits<Scalar>::HasDiv
}; };
}; };
@ -156,7 +156,7 @@ template<typename Scalar>
struct functor_traits<swap_assign_op<Scalar> > { struct functor_traits<swap_assign_op<Scalar> > {
enum { enum {
Cost = 3 * NumTraits<Scalar>::ReadCost, Cost = 3 * NumTraits<Scalar>::ReadCost,
PacketAccess = packet_traits<Scalar>::IsVectorized PacketAccess = packet_traits<Scalar>::Vectorizable
}; };
}; };