mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-09-12 17:33:15 +08:00
Fix vectorization logic wrt assignment functors
This commit is contained in:
parent
3a735a6cf1
commit
68e8ddaf94
@ -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);
|
||||||
|
@ -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
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user