Propagate block evaluation preference through rvalue tensor expressions

This commit is contained in:
Eugene Zhulenev 2019-10-17 11:17:33 -07:00
parent 0d2a14ce11
commit df0e8b8137
10 changed files with 51 additions and 41 deletions

View File

@ -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) -------------===//

View File

@ -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
}; };

View File

@ -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) -------------===//

View File

@ -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)

View File

@ -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
}; };

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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