11 #ifndef EIGEN_CXX11_TENSOR_TENSOR_REVERSE_H
12 #define EIGEN_CXX11_TENSOR_TENSOR_REVERSE_H
25 template <
typename ReverseDimensions,
typename XprType>
31 typedef typename XprType::Nested
Nested;
32 typedef std::remove_reference_t<Nested>
Nested_;
33 static constexpr
int NumDimensions = XprTraits::NumDimensions;
34 static constexpr
int Layout = XprTraits::Layout;
38 template <
typename ReverseDimensions,
typename XprType>
43 template <
typename ReverseDimensions,
typename XprType>
51 template <
typename ReverseDimensions,
typename XprType>
77 template <
typename ReverseDimensions,
typename ArgType,
typename Device>
94 BlockAccess = NumDims > 0,
95 PreferBlockAccess =
true,
117 m_dimensions = m_impl.dimensions();
120 for (
int i = 1;
i < NumDims; ++
i) {
121 m_strides[
i] = m_strides[
i - 1] * m_dimensions[
i - 1];
125 m_strides[NumDims - 1] = 1;
126 for (
int i = NumDims - 2;
i >= 0; --
i) {
127 m_strides[
i] = m_strides[
i + 1] * m_dimensions[
i + 1];
136 m_impl.evalSubExprsIfNeeded(NULL);
140 #ifdef EIGEN_USE_THREADS
141 template <
typename EvalSubExprsCallback>
143 m_impl.evalSubExprsIfNeededAsync(
nullptr, [done](
bool) { done(
true); });
151 Index inputIndex = 0;
154 for (
int i = NumDims - 1;
i > 0; --
i) {
155 Index idx = index / m_fastStrides[
i];
156 index -= idx * m_strides[
i];
158 idx = m_dimensions[
i] - idx - 1;
160 inputIndex += idx * m_strides[
i];
163 inputIndex += (m_dimensions[0] - index - 1);
169 for (
int i = 0;
i < NumDims - 1; ++
i) {
170 Index idx = index / m_fastStrides[
i];
171 index -= idx * m_strides[
i];
173 idx = m_dimensions[
i] - idx - 1;
175 inputIndex += idx * m_strides[
i];
177 if (m_reverse[NumDims - 1]) {
178 inputIndex += (m_dimensions[NumDims - 1] - index - 1);
187 return m_impl.coeff(reverseIndex(index));
190 template <
int LoadMode>
206 const size_t target_size =
m_device.lastLevelCacheSize();
209 return internal::TensorBlockResourceRequirements::skewed<Scalar>(target_size).addCostPerCoeff({0, 0, 24});
213 bool =
false)
const {
221 static const bool isColMajor =
static_cast<int>(
Layout) ==
static_cast<int>(
ColMajor);
223 static const Index inner_dim_idx = isColMajor ? 0 : NumDims - 1;
224 const bool inner_dim_reversed = m_reverse[inner_dim_idx];
227 Index block_offset = 0;
235 for (
int i = 0;
i < NumDims; ++
i) {
236 const int dim = isColMajor ?
i : NumDims - 1 -
i;
239 it[
i].reverse = m_reverse[dim];
241 it[
i].block_stride =
i == 0 ? 1 : (it[
i - 1].size * it[
i - 1].block_stride);
242 it[
i].block_span = it[
i].block_stride * (it[
i].size - 1);
244 it[
i].input_stride = m_strides[dim];
245 it[
i].input_span = it[
i].input_stride * (it[
i].size - 1);
248 it[
i].input_stride = -1 * it[
i].input_stride;
249 it[
i].input_span = -1 * it[
i].input_span;
255 int effective_inner_dim = 0;
256 for (
int i = 1;
i < NumDims; ++
i) {
258 if (it[
i].block_stride != it[effective_inner_dim].
size)
break;
259 if (it[
i].block_stride !=
numext::abs(it[
i].input_stride))
break;
261 it[
i].size = it[effective_inner_dim].size * it[
i].size;
263 it[
i].block_stride = 1;
264 it[
i].input_stride = (inner_dim_reversed ? -1 : 1);
266 it[
i].block_span = it[
i].block_stride * (it[
i].size - 1);
267 it[
i].input_span = it[
i].input_stride * (it[
i].size - 1);
269 effective_inner_dim =
i;
272 eigen_assert(it[effective_inner_dim].block_stride == 1);
273 eigen_assert(it[effective_inner_dim].input_stride == (inner_dim_reversed ? -1 : 1));
275 const Index inner_dim_size = it[effective_inner_dim].size;
281 while (it[NumDims - 1].count < it[NumDims - 1].
size) {
283 Index dst = block_offset;
284 Index src = input_offset;
288 if (inner_dim_reversed) {
289 for (
Index i = 0;
i < inner_dim_size; ++
i) {
290 block_buffer[dst] = m_impl.coeff(src);
295 for (
Index i = 0;
i < inner_dim_size; ++
i) {
296 block_buffer[dst] = m_impl.coeff(src);
303 if ((NumDims - effective_inner_dim) == 1)
break;
306 for (
Index i = effective_inner_dim + 1;
i < NumDims; ++
i) {
307 if (++it[
i].count < it[
i].
size) {
308 block_offset += it[
i].block_stride;
309 input_offset += it[
i].input_stride;
312 if (
i != NumDims - 1) it[
i].count = 0;
313 block_offset -= it[
i].block_span;
314 input_offset -= it[
i].input_span;
322 double compute_cost = NumDims * (2 * TensorOpCost::AddCost<Index>() + 2 * TensorOpCost::MulCost<Index>() +
323 TensorOpCost::DivCost<Index>());
324 for (
int i = 0;
i < NumDims; ++
i) {
326 compute_cost += 2 * TensorOpCost::AddCost<Index>();
343 struct BlockIteratorState {
345 :
size(0), count(0),
reverse(false), block_stride(0), block_span(0), input_stride(0), input_span(0) {}
359 template <
typename ReverseDimensions,
typename ArgType,
typename Device>
361 :
public TensorEvaluator<const TensorReverseOp<ReverseDimensions, ArgType>, Device> {
373 PreferBlockAccess =
false,
391 return this->m_impl.coeffRef(this->reverseIndex(index));
394 template <
int StoreMode>
400 internal::pstore<CoeffReturnType, PacketReturnType>(values,
x);
int i
Definition: BiCGSTAB_step_by_step.cpp:9
#define EIGEN_UNROLL_LOOP
Definition: Macros.h:1298
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:892
#define eigen_assert(x)
Definition: Macros.h:910
#define EIGEN_STRONG_INLINE
Definition: Macros.h:834
#define EIGEN_STATIC_ASSERT(X, MSG)
Definition: StaticAssert.h:26
#define EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(Derived)
Macro to manually inherit assignment operators. This is necessary, because the implicitly defined ass...
Definition: TensorMacros.h:81
#define EIGEN_DEVICE_REF
Definition: TensorMacros.h:34
void reverse(const MatrixType &m)
Definition: array_reverse.cpp:17
Scalar Scalar int size
Definition: benchVecAdd.cpp:17
SCALAR Scalar
Definition: bench_gemm.cpp:45
Generic expression where a coefficient-wise binary operator is applied to two expressions.
Definition: CwiseBinaryOp.h:79
The tensor base class.
Definition: TensorBase.h:1026
Definition: TensorCostModel.h:28
Definition: TensorReverse.h:52
TensorBase< TensorReverseOp< ReverseDimensions, XprType >, WriteAccessors > Base
Definition: TensorReverse.h:54
Eigen::internal::nested< TensorReverseOp >::type Nested
Definition: TensorReverse.h:58
const ReverseDimensions m_reverse_dims
Definition: TensorReverse.h:73
Eigen::internal::traits< TensorReverseOp >::StorageKind StorageKind
Definition: TensorReverse.h:59
XprType::CoeffReturnType CoeffReturnType
Definition: TensorReverse.h:57
XprType::Nested m_xpr
Definition: TensorReverse.h:72
Eigen::internal::traits< TensorReverseOp >::Scalar Scalar
Definition: TensorReverse.h:55
EIGEN_DEVICE_FUNC const ReverseDimensions & reverse() const
Definition: TensorReverse.h:65
Eigen::NumTraits< Scalar >::Real RealScalar
Definition: TensorReverse.h:56
Eigen::internal::traits< TensorReverseOp >::Index Index
Definition: TensorReverse.h:60
EIGEN_DEVICE_FUNC const internal::remove_all_t< typename XprType::Nested > & expression() const
Definition: TensorReverse.h:67
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorReverseOp(const XprType &expr, const ReverseDimensions &reverse_dims)
Definition: TensorReverse.h:62
IndexType offset() const
Definition: TensorBlock.h:270
IndexType dimension(int index) const
Definition: TensorBlock.h:272
Definition: TensorBlock.h:566
Definition: TensorBlock.h:475
Definition: TensorBlock.h:638
TensorMaterializedBlock AsTensorMaterializedBlock() const
Definition: TensorBlock.h:644
Scalar * data() const
Definition: TensorBlock.h:640
Definition: TensorBlock.h:604
static EIGEN_STRONG_INLINE Storage prepareStorage(TensorBlockDesc &desc, TensorBlockScratch &scratch, bool allow_strided_storage=false)
Definition: TensorBlock.h:671
@ WriteAccessors
Definition: Constants.h:374
@ ColMajor
Definition: Constants.h:318
char char * op
Definition: level2_impl.h:374
typename remove_all< T >::type remove_all_t
Definition: Meta.h:142
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE std::enable_if_t< NumTraits< T >::IsSigned||NumTraits< T >::IsComplex, typename NumTraits< T >::Real > abs(const T &x)
Definition: MathFunctions.h:1355
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
std::array< T, N > array
Definition: EmulateArray.h:231
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
Definition: Eigen_Colamd.h:49
list x
Definition: plotDoE.py:28
Definition: Constants.h:519
T Real
Definition: NumTraits.h:183
Definition: TensorMeta.h:47
Definition: TensorForwardDeclarations.h:42
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writePacket(Index index, const PacketReturnType &x) const
Definition: TensorReverse.h:395
EIGEN_STRONG_INLINE TensorEvaluator(const XprType &op, const Device &device)
Definition: TensorReverse.h:377
DSizes< Index, NumDims > Dimensions
Definition: TensorReverse.h:366
internal::TensorBlockNotImplemented TensorBlock
Definition: TensorReverse.h:385
TensorReverseOp< ReverseDimensions, ArgType > XprType
Definition: TensorReverse.h:363
XprType::Index Index
Definition: TensorReverse.h:364
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions & dimensions() const
Definition: TensorReverse.h:388
XprType::Scalar Scalar
Definition: TensorReverse.h:379
XprType::CoeffReturnType CoeffReturnType
Definition: TensorReverse.h:380
TensorEvaluator< const TensorReverseOp< ReverseDimensions, ArgType >, Device > Base
Definition: TensorReverse.h:362
PacketType< CoeffReturnType, Device >::type PacketReturnType
Definition: TensorReverse.h:381
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar & coeffRef(Index index) const
Definition: TensorReverse.h:390
Index count
Definition: TensorReverse.h:348
Index size
Definition: TensorReverse.h:347
Index block_span
Definition: TensorReverse.h:351
Index input_span
Definition: TensorReverse.h:353
Index input_stride
Definition: TensorReverse.h:352
BlockIteratorState()
Definition: TensorReverse.h:344
Index block_stride
Definition: TensorReverse.h:350
bool reverse
Definition: TensorReverse.h:349
Definition: TensorReverse.h:78
internal::TensorMaterializedBlock< CoeffReturnType, NumDims, Layout, Index > TensorBlock
Definition: TensorReverse.h:108
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
Definition: TensorReverse.h:191
EIGEN_STRONG_INLINE void cleanup()
Definition: TensorReverse.h:147
TensorEvaluator< ArgType, Device > m_impl
Definition: TensorReverse.h:338
internal::TensorBlockDescriptor< NumDims, Index > TensorBlockDesc
Definition: TensorReverse.h:103
EIGEN_DEVICE_FUNC Storage::Type data() const
Definition: TensorReverse.h:332
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
Definition: TensorReverse.h:186
Dimensions m_dimensions
Definition: TensorReverse.h:335
XprType::Index Index
Definition: TensorReverse.h:80
XprType::CoeffReturnType CoeffReturnType
Definition: TensorReverse.h:84
Storage::Type EvaluatorPointerType
Definition: TensorReverse.h:88
EIGEN_STRONG_INLINE TensorEvaluator(const XprType &op, const Device &device)
Definition: TensorReverse.h:111
internal::TensorIntDivisor< Index > IndexDivisor
Definition: TensorReverse.h:100
DSizes< Index, NumDims > Dimensions
Definition: TensorReverse.h:82
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions & dimensions() const
Definition: TensorReverse.h:133
PacketType< CoeffReturnType, Device >::type PacketReturnType
Definition: TensorReverse.h:85
array< Index, NumDims > m_strides
Definition: TensorReverse.h:336
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock block(TensorBlockDesc &desc, TensorBlockScratch &scratch, bool=false) const
Definition: TensorReverse.h:212
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::TensorBlockResourceRequirements getResourceRequirements() const
Definition: TensorReverse.h:205
internal::TensorBlockScratchAllocator< Device > TensorBlockScratch
Definition: TensorReverse.h:104
StorageMemory< CoeffReturnType, Device > Storage
Definition: TensorReverse.h:87
TensorReverseOp< ReverseDimensions, ArgType > XprType
Definition: TensorReverse.h:79
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index reverseIndex(Index index) const
Definition: TensorReverse.h:149
array< IndexDivisor, NumDims > m_fastStrides
Definition: TensorReverse.h:337
const Device EIGEN_DEVICE_REF m_device
Definition: TensorReverse.h:340
XprType::Scalar Scalar
Definition: TensorReverse.h:83
TensorEvaluator< const ArgType, Device >::TensorBlock ArgTensorBlock
Definition: TensorReverse.h:106
EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType)
Definition: TensorReverse.h:135
ReverseDimensions m_reverse
Definition: TensorReverse.h:339
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const
Definition: TensorReverse.h:321
A cost model used to limit the number of threads used for evaluating tensor expression.
Definition: TensorEvaluator.h:31
static constexpr int Layout
Definition: TensorEvaluator.h:46
const Device EIGEN_DEVICE_REF m_device
Definition: TensorEvaluator.h:170
Storage::Type EvaluatorPointerType
Definition: TensorEvaluator.h:41
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType & coeffRef(Index index) const
Definition: TensorEvaluator.h:94
@ PacketAccess
Definition: TensorEvaluator.h:50
@ IsAligned
Definition: TensorEvaluator.h:49
static constexpr int PacketSize
Definition: TensorEvaluator.h:38
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
Definition: TensorEvaluator.h:89
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions & dimensions() const
Definition: TensorEvaluator.h:69
Definition: TensorBlock.h:75
const TensorReverseOp< ReverseDimensions, XprType > & type
Definition: TensorReverse.h:40
Definition: XprHelper.h:427
TensorReverseOp< ReverseDimensions, XprType > type
Definition: TensorReverse.h:46
Definition: TensorTraits.h:152
ref_selector< T >::type type
Definition: TensorTraits.h:153
XprTraits::StorageKind StorageKind
Definition: TensorReverse.h:29
XprTraits::PointerType PointerType
Definition: TensorReverse.h:35
XprType::Scalar Scalar
Definition: TensorReverse.h:27
XprTraits::Index Index
Definition: TensorReverse.h:30
traits< XprType > XprTraits
Definition: TensorReverse.h:28
XprType::Nested Nested
Definition: TensorReverse.h:31
std::remove_reference_t< Nested > Nested_
Definition: TensorReverse.h:32
Definition: ForwardDeclarations.h:21