mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-12 03:39:01 +08:00
Propagate block evaluation preference through rvalue tensor expressions
This commit is contained in:
parent
0d2a14ce11
commit
df0e8b8137
@ -90,7 +90,7 @@ struct TensorEvaluator<const TensorIndexTupleOp<ArgType>, Device>
|
|||||||
PacketAccess = /*TensorEvaluator<ArgType, Device>::PacketAccess*/ false,
|
PacketAccess = /*TensorEvaluator<ArgType, Device>::PacketAccess*/ false,
|
||||||
BlockAccess = false,
|
BlockAccess = false,
|
||||||
BlockAccessV2 = false,
|
BlockAccessV2 = false,
|
||||||
PreferBlockAccess = false,
|
PreferBlockAccess = TensorEvaluator<ArgType, Device>::PreferBlockAccess,
|
||||||
Layout = TensorEvaluator<ArgType, Device>::Layout,
|
Layout = TensorEvaluator<ArgType, Device>::Layout,
|
||||||
CoordAccess = false, // to be implemented
|
CoordAccess = false, // to be implemented
|
||||||
RawAccess = false
|
RawAccess = false
|
||||||
@ -228,14 +228,14 @@ struct TensorEvaluator<const TensorTupleReducerOp<ReduceOp, Dims, ArgType>, Devi
|
|||||||
typedef StorageMemory<TupleType, Device> TupleStorageMem;
|
typedef StorageMemory<TupleType, Device> TupleStorageMem;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
IsAligned = /*TensorEvaluator<ArgType, Device>::IsAligned*/ false,
|
IsAligned = /*TensorEvaluator<ArgType, Device>::IsAligned*/ false,
|
||||||
PacketAccess = /*TensorEvaluator<ArgType, Device>::PacketAccess*/ false,
|
PacketAccess = /*TensorEvaluator<ArgType, Device>::PacketAccess*/ false,
|
||||||
BlockAccess = false,
|
BlockAccess = false,
|
||||||
BlockAccessV2 = false,
|
BlockAccessV2 = false,
|
||||||
PreferBlockAccess = false,
|
PreferBlockAccess = TensorEvaluator<ArgType, Device>::PreferBlockAccess,
|
||||||
Layout = TensorEvaluator<const TensorReductionOp<ReduceOp, Dims, const TensorIndexTupleOp<ArgType> >, Device>::Layout,
|
Layout = TensorEvaluator<const TensorReductionOp<ReduceOp, Dims, const TensorIndexTupleOp<ArgType> >, Device>::Layout,
|
||||||
CoordAccess = false, // to be implemented
|
CoordAccess = false, // to be implemented
|
||||||
RawAccess = false
|
RawAccess = false
|
||||||
};
|
};
|
||||||
|
|
||||||
//===- Tensor block evaluation strategy (see TensorBlock.h) -------------===//
|
//===- Tensor block evaluation strategy (see TensorBlock.h) -------------===//
|
||||||
|
@ -157,8 +157,10 @@ struct TensorEvaluator<const TensorChippingOp<DimId, ArgType>, Device>
|
|||||||
// Chipping inner-most dimension.
|
// Chipping inner-most dimension.
|
||||||
IsInnerChipping = (static_cast<int>(Layout) == ColMajor && DimId == 0) ||
|
IsInnerChipping = (static_cast<int>(Layout) == ColMajor && DimId == 0) ||
|
||||||
(static_cast<int>(Layout) == RowMajor && DimId == NumInputDims - 1),
|
(static_cast<int>(Layout) == RowMajor && DimId == NumInputDims - 1),
|
||||||
// Do not choose block access if chipping is trivial.
|
// Prefer block access if the underlying expression prefers it, otherwise
|
||||||
PreferBlockAccess = !IsOuterChipping,
|
// only if chipping is not trivial.
|
||||||
|
PreferBlockAccess = TensorEvaluator<ArgType, Device>::PreferBlockAccess ||
|
||||||
|
!IsOuterChipping,
|
||||||
CoordAccess = false, // to be implemented
|
CoordAccess = false, // to be implemented
|
||||||
RawAccess = false
|
RawAccess = false
|
||||||
};
|
};
|
||||||
|
@ -122,13 +122,15 @@ struct TensorEvaluator<const TensorConcatenationOp<Axis, LeftArgType, RightArgTy
|
|||||||
typedef StorageMemory<CoeffReturnType, Device> Storage;
|
typedef StorageMemory<CoeffReturnType, Device> Storage;
|
||||||
typedef typename Storage::Type EvaluatorPointerType;
|
typedef typename Storage::Type EvaluatorPointerType;
|
||||||
enum {
|
enum {
|
||||||
IsAligned = false,
|
IsAligned = false,
|
||||||
PacketAccess = TensorEvaluator<LeftArgType, Device>::PacketAccess & TensorEvaluator<RightArgType, Device>::PacketAccess,
|
PacketAccess = TensorEvaluator<LeftArgType, Device>::PacketAccess &&
|
||||||
BlockAccess = false,
|
TensorEvaluator<RightArgType, Device>::PacketAccess,
|
||||||
BlockAccessV2 = false,
|
BlockAccess = false,
|
||||||
PreferBlockAccess = false,
|
BlockAccessV2 = false,
|
||||||
Layout = TensorEvaluator<LeftArgType, Device>::Layout,
|
PreferBlockAccess = TensorEvaluator<LeftArgType, Device>::PreferBlockAccess ||
|
||||||
RawAccess = false
|
TensorEvaluator<RightArgType, Device>::PreferBlockAccess,
|
||||||
|
Layout = TensorEvaluator<LeftArgType, Device>::Layout,
|
||||||
|
RawAccess = false
|
||||||
};
|
};
|
||||||
|
|
||||||
//===- Tensor block evaluation strategy (see TensorBlock.h) -------------===//
|
//===- Tensor block evaluation strategy (see TensorBlock.h) -------------===//
|
||||||
@ -320,13 +322,15 @@ template<typename Axis, typename LeftArgType, typename RightArgType, typename De
|
|||||||
typedef TensorConcatenationOp<Axis, LeftArgType, RightArgType> XprType;
|
typedef TensorConcatenationOp<Axis, LeftArgType, RightArgType> XprType;
|
||||||
typedef typename Base::Dimensions Dimensions;
|
typedef typename Base::Dimensions Dimensions;
|
||||||
enum {
|
enum {
|
||||||
IsAligned = false,
|
IsAligned = false,
|
||||||
PacketAccess = TensorEvaluator<LeftArgType, Device>::PacketAccess & TensorEvaluator<RightArgType, Device>::PacketAccess,
|
PacketAccess = TensorEvaluator<LeftArgType, Device>::PacketAccess &&
|
||||||
BlockAccess = false,
|
TensorEvaluator<RightArgType, Device>::PacketAccess,
|
||||||
BlockAccessV2 = false,
|
BlockAccess = false,
|
||||||
PreferBlockAccess = false,
|
BlockAccessV2 = false,
|
||||||
Layout = TensorEvaluator<LeftArgType, Device>::Layout,
|
PreferBlockAccess = TensorEvaluator<LeftArgType, Device>::PreferBlockAccess ||
|
||||||
RawAccess = false
|
TensorEvaluator<RightArgType, Device>::PreferBlockAccess,
|
||||||
|
Layout = TensorEvaluator<LeftArgType, Device>::Layout,
|
||||||
|
RawAccess = false
|
||||||
};
|
};
|
||||||
|
|
||||||
//===- Tensor block evaluation strategy (see TensorBlock.h) -------------===//
|
//===- Tensor block evaluation strategy (see TensorBlock.h) -------------===//
|
||||||
|
@ -764,14 +764,18 @@ struct TensorEvaluator<const TensorCwiseTernaryOp<TernaryOp, Arg1Type, Arg2Type,
|
|||||||
|
|
||||||
enum {
|
enum {
|
||||||
IsAligned = TensorEvaluator<Arg1Type, Device>::IsAligned & TensorEvaluator<Arg2Type, Device>::IsAligned & TensorEvaluator<Arg3Type, Device>::IsAligned,
|
IsAligned = TensorEvaluator<Arg1Type, Device>::IsAligned & TensorEvaluator<Arg2Type, Device>::IsAligned & TensorEvaluator<Arg3Type, Device>::IsAligned,
|
||||||
PacketAccess = TensorEvaluator<Arg1Type, Device>::PacketAccess & TensorEvaluator<Arg2Type, Device>::PacketAccess & TensorEvaluator<Arg3Type, Device>::PacketAccess &
|
PacketAccess = TensorEvaluator<Arg1Type, Device>::PacketAccess &&
|
||||||
internal::functor_traits<TernaryOp>::PacketAccess,
|
TensorEvaluator<Arg2Type, Device>::PacketAccess &&
|
||||||
BlockAccess = false,
|
TensorEvaluator<Arg3Type, Device>::PacketAccess &&
|
||||||
BlockAccessV2 = false,
|
internal::functor_traits<TernaryOp>::PacketAccess,
|
||||||
PreferBlockAccess = false,
|
BlockAccess = false,
|
||||||
Layout = TensorEvaluator<Arg1Type, Device>::Layout,
|
BlockAccessV2 = false,
|
||||||
CoordAccess = false, // to be implemented
|
PreferBlockAccess = TensorEvaluator<Arg1Type, Device>::PreferBlockAccess ||
|
||||||
RawAccess = false
|
TensorEvaluator<Arg2Type, Device>::PreferBlockAccess ||
|
||||||
|
TensorEvaluator<Arg3Type, Device>::PreferBlockAccess,
|
||||||
|
Layout = TensorEvaluator<Arg1Type, Device>::Layout,
|
||||||
|
CoordAccess = false, // to be implemented
|
||||||
|
RawAccess = false
|
||||||
};
|
};
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC TensorEvaluator(const XprType& op, const Device& device)
|
EIGEN_DEVICE_FUNC TensorEvaluator(const XprType& op, const Device& device)
|
||||||
|
@ -121,7 +121,7 @@ struct TensorEvaluator<const TensorLayoutSwapOp<ArgType>, Device>
|
|||||||
PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
|
PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
|
||||||
BlockAccess = false,
|
BlockAccess = false,
|
||||||
BlockAccessV2 = false,
|
BlockAccessV2 = false,
|
||||||
PreferBlockAccess = false,
|
PreferBlockAccess = TensorEvaluator<ArgType, Device>::PreferBlockAccess,
|
||||||
Layout = (static_cast<int>(TensorEvaluator<ArgType, Device>::Layout) == static_cast<int>(ColMajor)) ? RowMajor : ColMajor,
|
Layout = (static_cast<int>(TensorEvaluator<ArgType, Device>::Layout) == static_cast<int>(ColMajor)) ? RowMajor : ColMajor,
|
||||||
CoordAccess = false, // to be implemented
|
CoordAccess = false, // to be implemented
|
||||||
RawAccess = TensorEvaluator<ArgType, Device>::RawAccess
|
RawAccess = TensorEvaluator<ArgType, Device>::RawAccess
|
||||||
@ -201,7 +201,7 @@ template<typename ArgType, typename Device>
|
|||||||
PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
|
PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
|
||||||
BlockAccess = false,
|
BlockAccess = false,
|
||||||
BlockAccessV2 = false,
|
BlockAccessV2 = false,
|
||||||
PreferBlockAccess = false,
|
PreferBlockAccess = TensorEvaluator<ArgType, Device>::PreferBlockAccess,
|
||||||
Layout = (static_cast<int>(TensorEvaluator<ArgType, Device>::Layout) == static_cast<int>(ColMajor)) ? RowMajor : ColMajor,
|
Layout = (static_cast<int>(TensorEvaluator<ArgType, Device>::Layout) == static_cast<int>(ColMajor)) ? RowMajor : ColMajor,
|
||||||
CoordAccess = false // to be implemented
|
CoordAccess = false // to be implemented
|
||||||
};
|
};
|
||||||
|
@ -1118,7 +1118,7 @@ struct TensorEvaluator<const TensorStridingSlicingOp<StartIndices, StopIndices,
|
|||||||
PacketAccess = false,
|
PacketAccess = false,
|
||||||
BlockAccess = false,
|
BlockAccess = false,
|
||||||
BlockAccessV2 = false,
|
BlockAccessV2 = false,
|
||||||
PreferBlockAccess = false,
|
PreferBlockAccess = TensorEvaluator<ArgType, Device>::PreferBlockAccess,
|
||||||
Layout = TensorEvaluator<ArgType, Device>::Layout,
|
Layout = TensorEvaluator<ArgType, Device>::Layout,
|
||||||
RawAccess = false
|
RawAccess = false
|
||||||
};
|
};
|
||||||
@ -1300,7 +1300,7 @@ struct TensorEvaluator<TensorStridingSlicingOp<StartIndices, StopIndices, Stride
|
|||||||
PacketAccess = false,
|
PacketAccess = false,
|
||||||
BlockAccess = false,
|
BlockAccess = false,
|
||||||
BlockAccessV2 = false,
|
BlockAccessV2 = false,
|
||||||
PreferBlockAccess = false,
|
PreferBlockAccess = TensorEvaluator<ArgType, Device>::PreferBlockAccess,
|
||||||
Layout = TensorEvaluator<ArgType, Device>::Layout,
|
Layout = TensorEvaluator<ArgType, Device>::Layout,
|
||||||
CoordAccess = TensorEvaluator<ArgType, Device>::CoordAccess,
|
CoordAccess = TensorEvaluator<ArgType, Device>::CoordAccess,
|
||||||
RawAccess = false
|
RawAccess = false
|
||||||
|
@ -98,7 +98,7 @@ struct TensorEvaluator<const TensorPatchOp<PatchDim, ArgType>, Device>
|
|||||||
PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
|
PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
|
||||||
BlockAccess = false,
|
BlockAccess = false,
|
||||||
BlockAccessV2 = false,
|
BlockAccessV2 = false,
|
||||||
PreferBlockAccess = false,
|
PreferBlockAccess = TensorEvaluator<ArgType, Device>::PreferBlockAccess,
|
||||||
Layout = TensorEvaluator<ArgType, Device>::Layout,
|
Layout = TensorEvaluator<ArgType, Device>::Layout,
|
||||||
CoordAccess = false,
|
CoordAccess = false,
|
||||||
RawAccess = false
|
RawAccess = false
|
||||||
|
@ -116,7 +116,7 @@ struct TensorEvaluator<const TensorStridingOp<Strides, ArgType>, Device>
|
|||||||
PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
|
PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
|
||||||
BlockAccess = false,
|
BlockAccess = false,
|
||||||
BlockAccessV2 = false,
|
BlockAccessV2 = false,
|
||||||
PreferBlockAccess = false,
|
PreferBlockAccess = TensorEvaluator<ArgType, Device>::PreferBlockAccess,
|
||||||
Layout = TensorEvaluator<ArgType, Device>::Layout,
|
Layout = TensorEvaluator<ArgType, Device>::Layout,
|
||||||
CoordAccess = false, // to be implemented
|
CoordAccess = false, // to be implemented
|
||||||
RawAccess = false
|
RawAccess = false
|
||||||
|
@ -99,7 +99,7 @@ struct TensorEvaluator<const TensorTraceOp<Dims, ArgType>, Device>
|
|||||||
PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
|
PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
|
||||||
BlockAccess = false,
|
BlockAccess = false,
|
||||||
BlockAccessV2 = false,
|
BlockAccessV2 = false,
|
||||||
PreferBlockAccess = false,
|
PreferBlockAccess = TensorEvaluator<ArgType, Device>::PreferBlockAccess,
|
||||||
Layout = TensorEvaluator<ArgType, Device>::Layout,
|
Layout = TensorEvaluator<ArgType, Device>::Layout,
|
||||||
CoordAccess = false,
|
CoordAccess = false,
|
||||||
RawAccess = false
|
RawAccess = false
|
||||||
|
@ -185,7 +185,7 @@ struct TensorEvaluator<const TensorVolumePatchOp<Planes, Rows, Cols, ArgType>, D
|
|||||||
PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
|
PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
|
||||||
BlockAccess = false,
|
BlockAccess = false,
|
||||||
BlockAccessV2 = false,
|
BlockAccessV2 = false,
|
||||||
PreferBlockAccess = false,
|
PreferBlockAccess = TensorEvaluator<ArgType, Device>::PreferBlockAccess,
|
||||||
Layout = TensorEvaluator<ArgType, Device>::Layout,
|
Layout = TensorEvaluator<ArgType, Device>::Layout,
|
||||||
CoordAccess = false,
|
CoordAccess = false,
|
||||||
RawAccess = false
|
RawAccess = false
|
||||||
|
Loading…
x
Reference in New Issue
Block a user