From df0e8b81370f741c734e4f4187d029d6a8cb18f2 Mon Sep 17 00:00:00 2001 From: Eugene Zhulenev Date: Thu, 17 Oct 2019 11:17:33 -0700 Subject: [PATCH] Propagate block evaluation preference through rvalue tensor expressions --- .../Eigen/CXX11/src/Tensor/TensorArgMax.h | 18 +++++------ .../Eigen/CXX11/src/Tensor/TensorChipping.h | 6 ++-- .../CXX11/src/Tensor/TensorConcatenation.h | 32 +++++++++++-------- .../Eigen/CXX11/src/Tensor/TensorEvaluator.h | 20 +++++++----- .../Eigen/CXX11/src/Tensor/TensorLayoutSwap.h | 4 +-- .../Eigen/CXX11/src/Tensor/TensorMorphing.h | 4 +-- .../Eigen/CXX11/src/Tensor/TensorPatch.h | 2 +- .../Eigen/CXX11/src/Tensor/TensorStriding.h | 2 +- .../Eigen/CXX11/src/Tensor/TensorTrace.h | 2 +- .../CXX11/src/Tensor/TensorVolumePatch.h | 2 +- 10 files changed, 51 insertions(+), 41 deletions(-) diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorArgMax.h b/unsupported/Eigen/CXX11/src/Tensor/TensorArgMax.h index 5cb5b7a2e..f2a5d86fe 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorArgMax.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorArgMax.h @@ -90,7 +90,7 @@ struct TensorEvaluator, Device> PacketAccess = /*TensorEvaluator::PacketAccess*/ false, BlockAccess = false, BlockAccessV2 = false, - PreferBlockAccess = false, + PreferBlockAccess = TensorEvaluator::PreferBlockAccess, Layout = TensorEvaluator::Layout, CoordAccess = false, // to be implemented RawAccess = false @@ -228,14 +228,14 @@ struct TensorEvaluator, Devi typedef StorageMemory TupleStorageMem; enum { - IsAligned = /*TensorEvaluator::IsAligned*/ false, - PacketAccess = /*TensorEvaluator::PacketAccess*/ false, - BlockAccess = false, - BlockAccessV2 = false, - PreferBlockAccess = false, - Layout = TensorEvaluator >, Device>::Layout, - CoordAccess = false, // to be implemented - RawAccess = false + IsAligned = /*TensorEvaluator::IsAligned*/ false, + PacketAccess = /*TensorEvaluator::PacketAccess*/ false, + BlockAccess = false, + BlockAccessV2 = false, + PreferBlockAccess = TensorEvaluator::PreferBlockAccess, + Layout = TensorEvaluator >, Device>::Layout, + CoordAccess = false, // to be implemented + RawAccess = false }; //===- Tensor block evaluation strategy (see TensorBlock.h) -------------===// diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorChipping.h b/unsupported/Eigen/CXX11/src/Tensor/TensorChipping.h index fe30f9867..32d6960bf 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorChipping.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorChipping.h @@ -157,8 +157,10 @@ struct TensorEvaluator, Device> // Chipping inner-most dimension. IsInnerChipping = (static_cast(Layout) == ColMajor && DimId == 0) || (static_cast(Layout) == RowMajor && DimId == NumInputDims - 1), - // Do not choose block access if chipping is trivial. - PreferBlockAccess = !IsOuterChipping, + // Prefer block access if the underlying expression prefers it, otherwise + // only if chipping is not trivial. + PreferBlockAccess = TensorEvaluator::PreferBlockAccess || + !IsOuterChipping, CoordAccess = false, // to be implemented RawAccess = false }; diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorConcatenation.h b/unsupported/Eigen/CXX11/src/Tensor/TensorConcatenation.h index c24e74ec6..26276abaf 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorConcatenation.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorConcatenation.h @@ -122,13 +122,15 @@ struct TensorEvaluator Storage; typedef typename Storage::Type EvaluatorPointerType; enum { - IsAligned = false, - PacketAccess = TensorEvaluator::PacketAccess & TensorEvaluator::PacketAccess, - BlockAccess = false, - BlockAccessV2 = false, - PreferBlockAccess = false, - Layout = TensorEvaluator::Layout, - RawAccess = false + IsAligned = false, + PacketAccess = TensorEvaluator::PacketAccess && + TensorEvaluator::PacketAccess, + BlockAccess = false, + BlockAccessV2 = false, + PreferBlockAccess = TensorEvaluator::PreferBlockAccess || + TensorEvaluator::PreferBlockAccess, + Layout = TensorEvaluator::Layout, + RawAccess = false }; //===- Tensor block evaluation strategy (see TensorBlock.h) -------------===// @@ -320,13 +322,15 @@ template XprType; typedef typename Base::Dimensions Dimensions; enum { - IsAligned = false, - PacketAccess = TensorEvaluator::PacketAccess & TensorEvaluator::PacketAccess, - BlockAccess = false, - BlockAccessV2 = false, - PreferBlockAccess = false, - Layout = TensorEvaluator::Layout, - RawAccess = false + IsAligned = false, + PacketAccess = TensorEvaluator::PacketAccess && + TensorEvaluator::PacketAccess, + BlockAccess = false, + BlockAccessV2 = false, + PreferBlockAccess = TensorEvaluator::PreferBlockAccess || + TensorEvaluator::PreferBlockAccess, + Layout = TensorEvaluator::Layout, + RawAccess = false }; //===- Tensor block evaluation strategy (see TensorBlock.h) -------------===// diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorEvaluator.h b/unsupported/Eigen/CXX11/src/Tensor/TensorEvaluator.h index 4c2767d44..ce2305b56 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorEvaluator.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorEvaluator.h @@ -764,14 +764,18 @@ struct TensorEvaluator::IsAligned & TensorEvaluator::IsAligned & TensorEvaluator::IsAligned, - PacketAccess = TensorEvaluator::PacketAccess & TensorEvaluator::PacketAccess & TensorEvaluator::PacketAccess & - internal::functor_traits::PacketAccess, - BlockAccess = false, - BlockAccessV2 = false, - PreferBlockAccess = false, - Layout = TensorEvaluator::Layout, - CoordAccess = false, // to be implemented - RawAccess = false + PacketAccess = TensorEvaluator::PacketAccess && + TensorEvaluator::PacketAccess && + TensorEvaluator::PacketAccess && + internal::functor_traits::PacketAccess, + BlockAccess = false, + BlockAccessV2 = false, + PreferBlockAccess = TensorEvaluator::PreferBlockAccess || + TensorEvaluator::PreferBlockAccess || + TensorEvaluator::PreferBlockAccess, + Layout = TensorEvaluator::Layout, + CoordAccess = false, // to be implemented + RawAccess = false }; EIGEN_DEVICE_FUNC TensorEvaluator(const XprType& op, const Device& device) diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorLayoutSwap.h b/unsupported/Eigen/CXX11/src/Tensor/TensorLayoutSwap.h index f84edc6b3..1da7a4e23 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorLayoutSwap.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorLayoutSwap.h @@ -121,7 +121,7 @@ struct TensorEvaluator, Device> PacketAccess = TensorEvaluator::PacketAccess, BlockAccess = false, BlockAccessV2 = false, - PreferBlockAccess = false, + PreferBlockAccess = TensorEvaluator::PreferBlockAccess, Layout = (static_cast(TensorEvaluator::Layout) == static_cast(ColMajor)) ? RowMajor : ColMajor, CoordAccess = false, // to be implemented RawAccess = TensorEvaluator::RawAccess @@ -201,7 +201,7 @@ template PacketAccess = TensorEvaluator::PacketAccess, BlockAccess = false, BlockAccessV2 = false, - PreferBlockAccess = false, + PreferBlockAccess = TensorEvaluator::PreferBlockAccess, Layout = (static_cast(TensorEvaluator::Layout) == static_cast(ColMajor)) ? RowMajor : ColMajor, CoordAccess = false // to be implemented }; diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorMorphing.h b/unsupported/Eigen/CXX11/src/Tensor/TensorMorphing.h index ab3a979a8..606d49a20 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorMorphing.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorMorphing.h @@ -1118,7 +1118,7 @@ struct TensorEvaluator::PreferBlockAccess, Layout = TensorEvaluator::Layout, RawAccess = false }; @@ -1300,7 +1300,7 @@ struct TensorEvaluator::PreferBlockAccess, Layout = TensorEvaluator::Layout, CoordAccess = TensorEvaluator::CoordAccess, RawAccess = false diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorPatch.h b/unsupported/Eigen/CXX11/src/Tensor/TensorPatch.h index 8158aa574..80afcff0f 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorPatch.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorPatch.h @@ -98,7 +98,7 @@ struct TensorEvaluator, Device> PacketAccess = TensorEvaluator::PacketAccess, BlockAccess = false, BlockAccessV2 = false, - PreferBlockAccess = false, + PreferBlockAccess = TensorEvaluator::PreferBlockAccess, Layout = TensorEvaluator::Layout, CoordAccess = false, RawAccess = false diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorStriding.h b/unsupported/Eigen/CXX11/src/Tensor/TensorStriding.h index 8c05704c2..061bf6bdf 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorStriding.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorStriding.h @@ -116,7 +116,7 @@ struct TensorEvaluator, Device> PacketAccess = TensorEvaluator::PacketAccess, BlockAccess = false, BlockAccessV2 = false, - PreferBlockAccess = false, + PreferBlockAccess = TensorEvaluator::PreferBlockAccess, Layout = TensorEvaluator::Layout, CoordAccess = false, // to be implemented RawAccess = false diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorTrace.h b/unsupported/Eigen/CXX11/src/Tensor/TensorTrace.h index 9dc7723cb..676717d8d 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorTrace.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorTrace.h @@ -99,7 +99,7 @@ struct TensorEvaluator, Device> PacketAccess = TensorEvaluator::PacketAccess, BlockAccess = false, BlockAccessV2 = false, - PreferBlockAccess = false, + PreferBlockAccess = TensorEvaluator::PreferBlockAccess, Layout = TensorEvaluator::Layout, CoordAccess = false, RawAccess = false diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorVolumePatch.h b/unsupported/Eigen/CXX11/src/Tensor/TensorVolumePatch.h index 292393e9a..ced963175 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorVolumePatch.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorVolumePatch.h @@ -185,7 +185,7 @@ struct TensorEvaluator, D PacketAccess = TensorEvaluator::PacketAccess, BlockAccess = false, BlockAccessV2 = false, - PreferBlockAccess = false, + PreferBlockAccess = TensorEvaluator::PreferBlockAccess, Layout = TensorEvaluator::Layout, CoordAccess = false, RawAccess = false