10 #ifndef EIGEN_CXX11_TENSOR_TENSOR_MORPHING_H
11 #define EIGEN_CXX11_TENSOR_TENSOR_MORPHING_H
26 template <
typename NewDimensions,
typename XprType>
32 typedef typename XprType::Nested
Nested;
33 typedef std::remove_reference_t<Nested>
Nested_;
35 static constexpr
int Layout = XprTraits::Layout;
39 template <
typename NewDimensions,
typename XprType>
44 template <
typename NewDimensions,
typename XprType>
52 template <
typename NewDimensions,
typename XprType>
77 template <
typename NewDimensions,
typename ArgType,
typename Device>
91 static constexpr
int NumInputDims =
104 (NumOutputDims == 2 && internal::index_statically_eq<NewDimensions>(0, 1)) ? OneByN
105 : (NumOutputDims == 2 && internal::index_statically_eq<NewDimensions>(1, 1)) ?
NByOne
117 PreferBlockAccess =
false,
132 : m_impl(
op.expression(), device), m_dimensions(
op.
dimensions()) {
140 #ifdef EIGEN_USE_THREADS
141 template <
typename EvalSubExprsCallback>
143 m_impl.evalSubExprsIfNeededAsync(
data, std::move(done));
152 template <
int LoadMode>
154 return m_impl.template packet<LoadMode>(index);
158 return m_impl.costPerCoeff(vectorized);
167 struct BlockIteratorState {
175 bool =
false)
const {
180 if (kind == OneByN || kind ==
NByOne) {
201 template <
typename NewDimensions,
typename ArgType,
typename Device>
203 :
public TensorEvaluator<const TensorReshapingOp<NewDimensions, ArgType>, Device>
215 PreferBlockAccess =
false,
232 return this->m_impl.coeffRef(index);
235 template <
int StoreMode>
237 this->m_impl.template writePacket<StoreMode>(index,
x);
240 template <
typename TensorBlock>
248 TensorBlockAssign::Run(TensorBlockAssign::target(desc.
dimensions(), internal::strides<Layout>(this->dimensions()),
249 this->m_impl.data(), desc.
offset()),
262 template <
typename StartIndices,
typename Sizes,
typename XprType>
269 typedef std::remove_reference_t<Nested>
Nested_;
271 static constexpr
int Layout = XprTraits::Layout;
275 template <
typename StartIndices,
typename Sizes,
typename XprType>
280 template <
typename StartIndices,
typename Sizes,
typename XprType>
288 template <
typename StartIndices,
typename Sizes,
typename XprType>
318 template <
typename Index,
typename Device,
bool BlockAccess>
322 const bool prefer_block_evaluation = BlockAccess && total > 32 * 1024;
323 return !prefer_block_evaluation && contiguous >
threshold_;
333 template <
typename Index,
bool BlockAccess>
342 #ifdef EIGEN_USE_SYCL
343 template <
typename Index,
bool BlockAccess>
344 struct MemcpyTriggerForSlicing<
Index,
Eigen::SyclDevice, BlockAccess> {
353 template <
typename StartIndices,
typename Sizes,
typename ArgType,
typename Device>
376 PreferBlockAccess =
true,
392 : m_impl(
op.expression(), device),
m_device(device), m_dimensions(
op.
sizes()), m_offsets(
op.startIndices()) {
393 m_is_identity =
true;
396 if (m_impl.dimensions()[
i] !=
op.sizes()[
i] ||
op.startIndices()[
i] != 0) {
397 m_is_identity =
false;
402 if (NumDims == 0)
return;
405 const Sizes& output_dims =
op.sizes();
407 m_inputStrides[0] = 1;
408 for (
int i = 1;
i < NumDims; ++
i) {
409 m_inputStrides[
i] = m_inputStrides[
i - 1] * input_dims[
i - 1];
413 m_outputStrides[0] = 1;
414 for (
int i = 1;
i < NumDims; ++
i) {
415 m_outputStrides[
i] = m_outputStrides[
i - 1] * output_dims[
i - 1];
419 m_inputStrides[NumDims - 1] = 1;
420 for (
int i = NumDims - 2;
i >= 0; --
i) {
421 m_inputStrides[
i] = m_inputStrides[
i + 1] * input_dims[
i + 1];
425 m_outputStrides[NumDims - 1] = 1;
426 for (
int i = NumDims - 2;
i >= 0; --
i) {
427 m_outputStrides[
i] = m_outputStrides[
i + 1] * output_dims[
i + 1];
436 m_impl.evalSubExprsIfNeeded(NULL);
437 if (!
NumTraits<std::remove_const_t<Scalar>>::RequireInitialization &&
data && m_impl.data()) {
438 Index contiguous_values = 1;
440 for (
int i = 0;
i < NumDims; ++
i) {
447 for (
int i = NumDims - 1;
i >= 0; --
i) {
459 Index offset = srcCoeff(
i);
461 contiguous_values *
sizeof(
Scalar));
469 #ifdef EIGEN_USE_THREADS
470 template <
typename EvalSubExprsCallback>
472 m_impl.evalSubExprsIfNeededAsync(
nullptr, [done](
bool) { done(
true); });
480 return m_impl.coeff(index);
482 return m_impl.coeff(srcCoeff(index));
486 template <
int LoadMode>
493 return m_impl.template packet<LoadMode>(index);
496 Index inputIndices[] = {0, 0};
497 Index indices[] = {index, index + packetSize - 1};
500 for (
int i = NumDims - 1;
i > 0; --
i) {
501 const Index idx0 = indices[0] / m_fastOutputStrides[
i];
502 const Index idx1 = indices[1] / m_fastOutputStrides[
i];
503 inputIndices[0] += (idx0 + m_offsets[
i]) * m_inputStrides[
i];
504 inputIndices[1] += (idx1 + m_offsets[
i]) * m_inputStrides[
i];
505 indices[0] -= idx0 * m_outputStrides[
i];
506 indices[1] -= idx1 * m_outputStrides[
i];
508 inputIndices[0] += (indices[0] + m_offsets[0]);
509 inputIndices[1] += (indices[1] + m_offsets[0]);
512 for (
int i = 0;
i < NumDims - 1; ++
i) {
513 const Index idx0 = indices[0] / m_fastOutputStrides[
i];
514 const Index idx1 = indices[1] / m_fastOutputStrides[
i];
515 inputIndices[0] += (idx0 + m_offsets[
i]) * m_inputStrides[
i];
516 inputIndices[1] += (idx1 + m_offsets[
i]) * m_inputStrides[
i];
517 indices[0] -= idx0 * m_outputStrides[
i];
518 indices[1] -= idx1 * m_outputStrides[
i];
520 inputIndices[0] += (indices[0] + m_offsets[NumDims - 1]);
521 inputIndices[1] += (indices[1] + m_offsets[NumDims - 1]);
523 if (inputIndices[1] - inputIndices[0] == packetSize - 1) {
527 EIGEN_ALIGN_MAX std::remove_const_t<CoeffReturnType> values[packetSize];
528 values[0] = m_impl.coeff(inputIndices[0]);
529 values[packetSize - 1] = m_impl.coeff(inputIndices[1]);
531 for (
int i = 1;
i < packetSize - 1; ++
i) {
540 return m_impl.costPerCoeff(vectorized) +
TensorOpCost(0, 0, m_is_identity ? 1 : NumDims);
544 const size_t target_size =
m_device.lastLevelCacheSize();
546 internal::TensorBlockResourceRequirements::skewed<Scalar>(target_size), m_impl.getResourceRequirements());
550 bool =
false)
const {
562 for (
int i = 0;
i < NumDims; ++
i) {
563 if (m_dimensions[
i] != m_impl.dimensions()[
i]) {
564 offset += m_offsets[
i] * m_inputStrides[
i];
565 for (
int j =
i + 1;
j < NumDims; ++
j) {
566 if (m_dimensions[
j] > 1) {
569 offset += m_offsets[
j] * m_inputStrides[
j];
575 for (
int i = NumDims - 1;
i >= 0; --
i) {
576 if (m_dimensions[
i] != m_impl.dimensions()[
i]) {
577 offset += m_offsets[
i] * m_inputStrides[
i];
578 for (
int j =
i - 1;
j >= 0; --
j) {
579 if (m_dimensions[
j] > 1) {
582 offset += m_offsets[
j] * m_inputStrides[
j];
588 return result + offset;
595 Index inputIndex = 0;
598 for (
int i = NumDims - 1;
i > 0; --
i) {
599 const Index idx = index / m_fastOutputStrides[
i];
600 inputIndex += (idx + m_offsets[
i]) * m_inputStrides[
i];
601 index -= idx * m_outputStrides[
i];
603 inputIndex += (index + m_offsets[0]);
606 for (
int i = 0;
i < NumDims - 1; ++
i) {
607 const Index idx = index / m_fastOutputStrides[
i];
608 inputIndex += (idx + m_offsets[
i]) * m_inputStrides[
i];
609 index -= idx * m_outputStrides[
i];
611 inputIndex += (index + m_offsets[NumDims - 1]);
627 template <
typename StartIndices,
typename Sizes,
typename ArgType,
typename Device>
629 :
public TensorEvaluator<const TensorSlicingOp<StartIndices, Sizes, ArgType>, Device> {
645 PreferBlockAccess =
true,
660 if (this->m_is_identity) {
661 return this->m_impl.coeffRef(index);
663 return this->m_impl.coeffRef(this->srcCoeff(index));
667 template <
int StoreMode>
669 if (this->m_is_identity) {
670 this->m_impl.template writePacket<StoreMode>(index,
x);
675 Index inputIndices[] = {0, 0};
676 Index indices[] = {index, index + packetSize - 1};
679 for (
int i = NumDims - 1;
i > 0; --
i) {
680 const Index idx0 = indices[0] / this->m_fastOutputStrides[
i];
681 const Index idx1 = indices[1] / this->m_fastOutputStrides[
i];
682 inputIndices[0] += (idx0 + this->m_offsets[
i]) * this->m_inputStrides[
i];
683 inputIndices[1] += (idx1 + this->m_offsets[
i]) * this->m_inputStrides[
i];
684 indices[0] -= idx0 * this->m_outputStrides[
i];
685 indices[1] -= idx1 * this->m_outputStrides[
i];
687 inputIndices[0] += (indices[0] + this->m_offsets[0]);
688 inputIndices[1] += (indices[1] + this->m_offsets[0]);
691 for (
int i = 0;
i < NumDims - 1; ++
i) {
692 const Index idx0 = indices[0] / this->m_fastOutputStrides[
i];
693 const Index idx1 = indices[1] / this->m_fastOutputStrides[
i];
694 inputIndices[0] += (idx0 + this->m_offsets[
i]) * this->m_inputStrides[
i];
695 inputIndices[1] += (idx1 + this->m_offsets[
i]) * this->m_inputStrides[
i];
696 indices[0] -= idx0 * this->m_outputStrides[
i];
697 indices[1] -= idx1 * this->m_outputStrides[
i];
699 inputIndices[0] += (indices[0] + this->m_offsets[NumDims - 1]);
700 inputIndices[1] += (indices[1] + this->m_offsets[NumDims - 1]);
702 if (inputIndices[1] - inputIndices[0] == packetSize - 1) {
703 this->m_impl.template writePacket<StoreMode>(inputIndices[0],
x);
706 internal::pstore<CoeffReturnType, PacketReturnType>(values,
x);
707 this->m_impl.coeffRef(inputIndices[0]) = values[0];
708 this->m_impl.coeffRef(inputIndices[1]) = values[packetSize - 1];
710 for (
int i = 1;
i < packetSize - 1; ++
i) {
716 template <
typename TensorBlock>
719 this->m_impl.writeBlock(arg_desc,
block);
724 template <
typename StartIndices,
typename StopIndices,
typename Str
ides,
typename XprType>
731 typedef std::remove_reference_t<Nested>
Nested_;
733 static constexpr
int Layout = XprTraits::Layout;
737 template <
typename StartIndices,
typename StopIndices,
typename Str
ides,
typename XprType>
742 template <
typename StartIndices,
typename StopIndices,
typename Str
ides,
typename XprType>
750 template <
typename StartIndices,
typename StopIndices,
typename Str
ides,
typename XprType>
752 :
public TensorBase<TensorStridingSlicingOp<StartIndices, StopIndices, Strides, XprType>> {
781 template <
typename StartIndices,
typename StopIndices,
typename Str
ides,
typename ArgType,
typename Device>
814 if (m_strides[
i] > 0) {
815 startIndicesClamped[
i] = clamp(
op.startIndices()[
i], 0, m_impl.dimensions()[
i]);
816 stopIndicesClamped[
i] = clamp(
op.stopIndices()[
i], 0, m_impl.dimensions()[
i]);
819 startIndicesClamped[
i] = clamp(
op.startIndices()[
i], -1, m_impl.dimensions()[
i] - 1);
820 stopIndicesClamped[
i] = clamp(
op.stopIndices()[
i], -1, m_impl.dimensions()[
i] - 1);
822 m_startIndices[
i] = startIndicesClamped[
i];
826 const InputDimensions& input_dims = m_impl.
dimensions();
829 m_is_identity =
true;
830 for (
int i = 0;
i < NumDims;
i++) {
831 Index interval = stopIndicesClamped[
i] - startIndicesClamped[
i];
832 if (interval == 0 || ((interval < 0) != (m_strides[
i] < 0))) {
835 m_dimensions[
i] = (interval / m_strides[
i]) + (interval % m_strides[
i] != 0 ? 1 : 0);
838 if (m_strides[
i] != 1 || interval != m_impl.dimensions()[
i]) {
839 m_is_identity =
false;
843 Strides output_dims = m_dimensions;
846 m_inputStrides[0] = m_strides[0];
847 m_offsets[0] = startIndicesClamped[0];
848 Index previousDimProduct = 1;
849 for (
int i = 1;
i < NumDims; ++
i) {
850 previousDimProduct *= input_dims[
i - 1];
851 m_inputStrides[
i] = previousDimProduct * m_strides[
i];
852 m_offsets[
i] = startIndicesClamped[
i] * previousDimProduct;
856 m_outputStrides[0] = 1;
857 for (
int i = 1;
i < NumDims; ++
i) {
858 m_outputStrides[
i] = m_outputStrides[
i - 1] * output_dims[
i - 1];
862 m_inputStrides[NumDims - 1] = m_strides[NumDims - 1];
863 m_offsets[NumDims - 1] = startIndicesClamped[NumDims - 1];
864 Index previousDimProduct = 1;
865 for (
int i = NumDims - 2;
i >= 0; --
i) {
866 previousDimProduct *= input_dims[
i + 1];
867 m_inputStrides[
i] = previousDimProduct * m_strides[
i];
868 m_offsets[
i] = startIndicesClamped[
i] * previousDimProduct;
871 m_outputStrides[NumDims - 1] = 1;
872 for (
int i = NumDims - 2;
i >= 0; --
i) {
873 m_outputStrides[
i] = m_outputStrides[
i + 1] * output_dims[
i + 1];
882 m_impl.evalSubExprsIfNeeded(NULL);
890 return m_impl.coeff(index);
892 return m_impl.coeff(srcCoeff(index));
897 return m_impl.costPerCoeff(vectorized) +
TensorOpCost(0, 0, m_is_identity ? 1 : NumDims);
904 Index inputIndex = 0;
907 for (
int i = NumDims - 1;
i >= 0; --
i) {
908 const Index idx = index / m_fastOutputStrides[
i];
909 inputIndex += idx * m_inputStrides[
i] + m_offsets[
i];
910 index -= idx * m_outputStrides[
i];
914 for (
int i = 0;
i < NumDims; ++
i) {
915 const Index idx = index / m_fastOutputStrides[
i];
916 inputIndex += idx * m_inputStrides[
i] + m_offsets[
i];
917 index -= idx * m_outputStrides[
i];
924 #ifndef SYCL_DEVICE_ONLY
944 template <
typename StartIndices,
typename StopIndices,
typename Str
ides,
typename ArgType,
typename Device>
946 :
public TensorEvaluator<const TensorStridingSlicingOp<StartIndices, StopIndices, Strides, ArgType>, Device> {
974 if (this->m_is_identity) {
975 return this->m_impl.coeffRef(index);
977 return this->m_impl.coeffRef(this->srcCoeff(index));
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
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: TensorMorphing.h:53
Eigen::internal::nested< TensorReshapingOp >::type Nested
Definition: TensorMorphing.h:58
Eigen::internal::traits< TensorReshapingOp >::Scalar Scalar
Definition: TensorMorphing.h:56
TensorBase< TensorReshapingOp< NewDimensions, XprType >, WriteAccessors > Base
Definition: TensorMorphing.h:55
const NewDimensions m_dims
Definition: TensorMorphing.h:73
std::remove_const_t< typename XprType::CoeffReturnType > CoeffReturnType
Definition: TensorMorphing.h:57
EIGEN_DEVICE_FUNC const internal::remove_all_t< typename XprType::Nested > & expression() const
Definition: TensorMorphing.h:67
Eigen::internal::traits< TensorReshapingOp >::StorageKind StorageKind
Definition: TensorMorphing.h:59
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorReshapingOp(const XprType &expr, const NewDimensions &dims)
Definition: TensorMorphing.h:62
EIGEN_DEVICE_FUNC const NewDimensions & dimensions() const
Definition: TensorMorphing.h:65
XprType::Nested m_xpr
Definition: TensorMorphing.h:72
Eigen::internal::traits< TensorReshapingOp >::Index Index
Definition: TensorMorphing.h:60
Definition: TensorMorphing.h:289
XprType::Nested m_xpr
Definition: TensorMorphing.h:310
XprType::CoeffReturnType CoeffReturnType
Definition: TensorMorphing.h:293
TensorBase< TensorSlicingOp< StartIndices, Sizes, XprType > > Base
Definition: TensorMorphing.h:291
const Sizes m_sizes
Definition: TensorMorphing.h:312
Eigen::internal::traits< TensorSlicingOp >::Scalar Scalar
Definition: TensorMorphing.h:292
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorSlicingOp(const XprType &expr, const StartIndices &indices, const Sizes &sizes)
Definition: TensorMorphing.h:298
Eigen::internal::traits< TensorSlicingOp >::Index Index
Definition: TensorMorphing.h:296
EIGEN_DEVICE_FUNC const StartIndices & startIndices() const
Definition: TensorMorphing.h:302
Eigen::internal::traits< TensorSlicingOp >::StorageKind StorageKind
Definition: TensorMorphing.h:295
const StartIndices m_indices
Definition: TensorMorphing.h:311
EIGEN_DEVICE_FUNC const internal::remove_all_t< typename XprType::Nested > & expression() const
Definition: TensorMorphing.h:305
EIGEN_DEVICE_FUNC const Sizes & sizes() const
Definition: TensorMorphing.h:303
Eigen::internal::nested< TensorSlicingOp >::type Nested
Definition: TensorMorphing.h:294
Definition: TensorMorphing.h:752
internal::traits< TensorStridingSlicingOp >::Scalar Scalar
Definition: TensorMorphing.h:755
internal::traits< TensorStridingSlicingOp >::Index Index
Definition: TensorMorphing.h:759
EIGEN_DEVICE_FUNC const StartIndices & strides() const
Definition: TensorMorphing.h:767
XprType::Nested m_xpr
Definition: TensorMorphing.h:774
internal::traits< TensorStridingSlicingOp >::StorageKind StorageKind
Definition: TensorMorphing.h:758
const StartIndices m_startIndices
Definition: TensorMorphing.h:775
internal::nested< TensorStridingSlicingOp >::type Nested
Definition: TensorMorphing.h:757
XprType::CoeffReturnType CoeffReturnType
Definition: TensorMorphing.h:756
EIGEN_DEVICE_FUNC const StartIndices & stopIndices() const
Definition: TensorMorphing.h:766
EIGEN_DEVICE_FUNC const StartIndices & startIndices() const
Definition: TensorMorphing.h:765
TensorBase< TensorStridingSlicingOp< StartIndices, StopIndices, Strides, XprType > > Base
Definition: TensorMorphing.h:754
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorStridingSlicingOp(const XprType &expr, const StartIndices &startIndices, const StopIndices &stopIndices, const Strides &strides)
Definition: TensorMorphing.h:761
EIGEN_DEVICE_FUNC const internal::remove_all_t< typename XprType::Nested > & expression() const
Definition: TensorMorphing.h:769
const StopIndices m_stopIndices
Definition: TensorMorphing.h:776
const Strides m_strides
Definition: TensorMorphing.h:777
Definition: TensorBlock.h:1314
Definition: TensorBlock.h:171
TensorBlockDescriptor WithOffset(IndexType offset) const
Definition: TensorBlock.h:298
IndexType offset() const
Definition: TensorBlock.h:270
bool HasDestinationBuffer() const
Definition: TensorBlock.h:295
TensorBlockDescriptor & DropDestinationBuffer()
Definition: TensorBlock.h:289
const Dimensions & dimensions() const
Definition: TensorBlock.h:271
Definition: TensorBlock.h:566
Definition: TensorBlock.h:475
Definition: TensorBlock.h:604
static EIGEN_STRONG_INLINE TensorMaterializedBlock materialize(const Scalar *data, const DataDimensions &data_dims, TensorBlockDesc &desc, TensorBlockScratch &scratch)
Definition: TensorBlock.h:699
const XprType & expr() const
Definition: TensorBlock.h:621
Eigen::IndexList< Index, Eigen::type2index< 1 > > NByOne(Index n)
Definition: cxx11_tensor_block_eval.cpp:104
std::vector< Array2i > sizes
Definition: dense_solvers.cpp:12
@ WriteAccessors
Definition: Constants.h:374
@ ColMajor
Definition: Constants.h:318
char char * op
Definition: level2_impl.h:374
@ kView
Definition: TensorBlock.h:545
constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE auto array_prod(const array< T, N > &arr) -> decltype(array_reduce< product_op, T, N >(arr, static_cast< T >(1)))
Definition: MoreMeta.h:497
typename remove_all< T >::type remove_all_t
Definition: Meta.h:142
EIGEN_ALWAYS_INLINE DSizes< IndexType, NumDims > strides(const DSizes< IndexType, NumDims > &dimensions)
Definition: TensorBlock.h:29
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T maxi(const T &x, const T &y)
Definition: MathFunctions.h:926
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T mini(const T &x, const T &y)
Definition: MathFunctions.h:920
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
std::array< T, N > array
Definition: EmulateArray.h:231
squared absolute value
Definition: GlobalFunctions.h:87
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
CleanedUpDerType< DerType >::type() min(const AutoDiffScalar< DerType > &x, const T &y)
Definition: AutoDiffScalar.h:494
CleanedUpDerType< DerType >::type() max(const AutoDiffScalar< DerType > &x, const T &y)
Definition: AutoDiffScalar.h:499
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T * constCast(const T *data)
Definition: TensorForwardDeclarations.h:31
Definition: Eigen_Colamd.h:49
list x
Definition: plotDoE.py:28
Definition: Constants.h:519
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
Definition: TensorMeta.h:47
Definition: TensorDimensions.h:85
Definition: TensorForwardDeclarations.h:42
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writePacket(Index index, const PacketReturnType &x) const
Definition: TensorMorphing.h:236
XprType::Scalar Scalar
Definition: TensorMorphing.h:223
TensorEvaluator< const TensorReshapingOp< NewDimensions, ArgType >, Device > Base
Definition: TensorMorphing.h:206
TensorReshapingOp< NewDimensions, ArgType > XprType
Definition: TensorMorphing.h:207
NewDimensions Dimensions
Definition: TensorMorphing.h:208
XprType::CoeffReturnType CoeffReturnType
Definition: TensorMorphing.h:224
PacketType< CoeffReturnType, Device >::type PacketReturnType
Definition: TensorMorphing.h:225
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType & coeffRef(Index index) const
Definition: TensorMorphing.h:231
internal::TensorBlockDescriptor< TensorEvaluator::NumOutputDims, Index > TensorBlockDesc
Definition: TensorMorphing.h:228
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writeBlock(const TensorBlockDesc &desc, const TensorBlock &block)
Definition: TensorMorphing.h:241
XprType::Index Index
Definition: TensorMorphing.h:222
EIGEN_STRONG_INLINE TensorEvaluator(const XprType &op, const Device &device)
Definition: TensorMorphing.h:220
XprType::Index Index
Definition: TensorMorphing.h:634
XprType::CoeffReturnType CoeffReturnType
Definition: TensorMorphing.h:636
EIGEN_STRONG_INLINE TensorEvaluator(const XprType &op, const Device &device)
Definition: TensorMorphing.h:657
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writeBlock(const TensorBlockDesc &desc, const TensorBlock &block)
Definition: TensorMorphing.h:717
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType & coeffRef(Index index) const
Definition: TensorMorphing.h:659
TensorSlicingOp< StartIndices, Sizes, ArgType > XprType
Definition: TensorMorphing.h:631
TensorEvaluator< const TensorSlicingOp< StartIndices, Sizes, ArgType >, Device > Base
Definition: TensorMorphing.h:630
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writePacket(Index index, const PacketReturnType &x) const
Definition: TensorMorphing.h:668
internal::TensorBlockScratchAllocator< Device > TensorBlockScratch
Definition: TensorMorphing.h:654
PacketType< CoeffReturnType, Device >::type PacketReturnType
Definition: TensorMorphing.h:637
Sizes Dimensions
Definition: TensorMorphing.h:638
std::remove_const_t< Scalar > ScalarNoConst
Definition: TensorMorphing.h:650
internal::TensorBlockDescriptor< NumDims, Index > TensorBlockDesc
Definition: TensorMorphing.h:653
XprType::Scalar Scalar
Definition: TensorMorphing.h:635
internal::TensorBlockNotImplemented TensorBlock
Definition: TensorMorphing.h:962
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType & coeffRef(Index index) const
Definition: TensorMorphing.h:973
XprType::Scalar Scalar
Definition: TensorMorphing.h:968
XprType::CoeffReturnType CoeffReturnType
Definition: TensorMorphing.h:969
TensorStridingSlicingOp< StartIndices, StopIndices, Strides, ArgType > XprType
Definition: TensorMorphing.h:948
Strides Dimensions
Definition: TensorMorphing.h:971
TensorEvaluator< const TensorStridingSlicingOp< StartIndices, StopIndices, Strides, ArgType >, Device > Base
Definition: TensorMorphing.h:947
PacketType< CoeffReturnType, Device >::type PacketReturnType
Definition: TensorMorphing.h:970
XprType::Index Index
Definition: TensorMorphing.h:967
EIGEN_STRONG_INLINE TensorEvaluator(const XprType &op, const Device &device)
Definition: TensorMorphing.h:965
Definition: TensorMorphing.h:78
TensorReshapingOp< NewDimensions, ArgType > XprType
Definition: TensorMorphing.h:79
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions & dimensions() const
Definition: TensorMorphing.h:138
ReshapingKind
Definition: TensorMorphing.h:94
NewDimensions Dimensions
Definition: TensorMorphing.h:80
EIGEN_DEVICE_FUNC Storage::Type data() const
Definition: TensorMorphing.h:191
StorageMemory< std::remove_const_t< CoeffReturnType >, Device > ConstCastStorage
Definition: TensorMorphing.h:88
NewDimensions m_dimensions
Definition: TensorMorphing.h:197
EIGEN_STRONG_INLINE TensorEvaluator(const XprType &op, const Device &device)
Definition: TensorMorphing.h:131
Storage::Type EvaluatorPointerType
Definition: TensorMorphing.h:87
PacketType< CoeffReturnType, Device >::type PacketReturnType
Definition: TensorMorphing.h:85
EIGEN_DEVICE_FUNC const TensorEvaluator< ArgType, Device > & impl() const
Definition: TensorMorphing.h:193
TensorEvaluator< ArgType, Device > m_impl
Definition: TensorMorphing.h:196
StorageMemory< CoeffReturnType, Device > Storage
Definition: TensorMorphing.h:86
EIGEN_STRONG_INLINE void cleanup()
Definition: TensorMorphing.h:148
internal::TensorBlockDescriptor< NumOutputDims, Index > TensorBlockDesc
Definition: TensorMorphing.h:125
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
Definition: TensorMorphing.h:153
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock block(TensorBlockDesc &desc, TensorBlockScratch &scratch, bool=false) const
Definition: TensorMorphing.h:174
internal::TensorMaterializedBlock< ScalarNoConst, NumOutputDims, Layout, Index > TensorBlock
Definition: TensorMorphing.h:128
XprType::Scalar Scalar
Definition: TensorMorphing.h:83
EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType data)
Definition: TensorMorphing.h:147
std::remove_const_t< Scalar > ScalarNoConst
Definition: TensorMorphing.h:122
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
Definition: TensorMorphing.h:150
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::TensorBlockResourceRequirements getResourceRequirements() const
Definition: TensorMorphing.h:161
XprType::CoeffReturnType CoeffReturnType
Definition: TensorMorphing.h:84
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const
Definition: TensorMorphing.h:157
internal::TensorBlockScratchAllocator< Device > TensorBlockScratch
Definition: TensorMorphing.h:126
XprType::Index Index
Definition: TensorMorphing.h:82
Index size
Definition: TensorMorphing.h:170
Index span
Definition: TensorMorphing.h:169
Index stride
Definition: TensorMorphing.h:168
Index count
Definition: TensorMorphing.h:171
Definition: TensorMorphing.h:354
TensorEvaluator< ArgType, Device > m_impl
Definition: TensorMorphing.h:619
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock block(TensorBlockDesc &desc, TensorBlockScratch &scratch, bool=false) const
Definition: TensorMorphing.h:549
XprType::Index Index
Definition: TensorMorphing.h:358
internal::TensorBlockDescriptor< NumDims, Index > TensorBlockDesc
Definition: TensorMorphing.h:384
array< Index, NumDims > m_outputStrides
Definition: TensorMorphing.h:616
internal::TensorBlockScratchAllocator< Device > TensorBlockScratch
Definition: TensorMorphing.h:385
const Device EIGEN_DEVICE_REF m_device
Definition: TensorMorphing.h:620
StorageMemory< CoeffReturnType, Device > Storage
Definition: TensorMorphing.h:363
StorageMemory< std::remove_const_t< CoeffReturnType >, Device > ConstCastStorage
Definition: TensorMorphing.h:364
EIGEN_STRONG_INLINE TensorEvaluator(const XprType &op, const Device &device)
Definition: TensorMorphing.h:391
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index srcCoeff(Index index) const
Definition: TensorMorphing.h:594
EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType data)
Definition: TensorMorphing.h:435
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
Definition: TensorMorphing.h:487
Sizes Dimensions
Definition: TensorMorphing.h:362
std::remove_const_t< Scalar > ScalarNoConst
Definition: TensorMorphing.h:381
EIGEN_STRONG_INLINE void cleanup()
Definition: TensorMorphing.h:476
Dimensions m_dimensions
Definition: TensorMorphing.h:621
TensorEvaluator< const ArgType, Device >::TensorBlock TensorBlock
Definition: TensorMorphing.h:388
XprType::CoeffReturnType CoeffReturnType
Definition: TensorMorphing.h:360
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::TensorBlockResourceRequirements getResourceRequirements() const
Definition: TensorMorphing.h:543
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions & dimensions() const
Definition: TensorMorphing.h:433
array< Index, NumDims > m_inputStrides
Definition: TensorMorphing.h:618
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Storage::Type data() const
Definition: TensorMorphing.h:557
XprType::Scalar Scalar
Definition: TensorMorphing.h:359
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
Definition: TensorMorphing.h:478
PacketType< CoeffReturnType, Device >::type PacketReturnType
Definition: TensorMorphing.h:361
const StartIndices m_offsets
Definition: TensorMorphing.h:623
bool m_is_identity
Definition: TensorMorphing.h:622
TensorSlicingOp< StartIndices, Sizes, ArgType > XprType
Definition: TensorMorphing.h:355
Storage::Type EvaluatorPointerType
Definition: TensorMorphing.h:365
array< internal::TensorIntDivisor< Index >, NumDims > m_fastOutputStrides
Definition: TensorMorphing.h:617
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const
Definition: TensorMorphing.h:539
Definition: TensorMorphing.h:782
PacketType< CoeffReturnType, Device >::type PacketReturnType
Definition: TensorMorphing.h:788
array< internal::TensorIntDivisor< Index >, NumDims > m_fastOutputStrides
Definition: TensorMorphing.h:932
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
Definition: TensorMorphing.h:888
EIGEN_STRONG_INLINE void cleanup()
Definition: TensorMorphing.h:886
TensorEvaluator< ArgType, Device > m_impl
Definition: TensorMorphing.h:935
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index clamp(Index value, Index min, Index max)
Definition: TensorMorphing.h:923
XprType::CoeffReturnType CoeffReturnType
Definition: TensorMorphing.h:787
StorageMemory< CoeffReturnType, Device > Storage
Definition: TensorMorphing.h:789
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index srcCoeff(Index index) const
Definition: TensorMorphing.h:903
TensorStridingSlicingOp< StartIndices, StopIndices, Strides, ArgType > XprType
Definition: TensorMorphing.h:783
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions & dimensions() const
Definition: TensorMorphing.h:879
array< Index, NumDims > m_outputStrides
Definition: TensorMorphing.h:931
EIGEN_STRONG_INLINE TensorEvaluator(const XprType &op, const Device &device)
Definition: TensorMorphing.h:808
XprType::Index Index
Definition: TensorMorphing.h:785
const Device EIGEN_DEVICE_REF m_device
Definition: TensorMorphing.h:936
EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType)
Definition: TensorMorphing.h:881
internal::TensorBlockNotImplemented TensorBlock
Definition: TensorMorphing.h:805
DSizes< Index, NumDims > m_dimensions
Definition: TensorMorphing.h:938
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const
Definition: TensorMorphing.h:896
XprType::Scalar Scalar
Definition: TensorMorphing.h:786
Strides Dimensions
Definition: TensorMorphing.h:791
Storage::Type EvaluatorPointerType
Definition: TensorMorphing.h:790
bool m_is_identity
Definition: TensorMorphing.h:934
const Strides m_strides
Definition: TensorMorphing.h:940
DSizes< Index, NumDims > m_startIndices
Definition: TensorMorphing.h:937
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Storage::Type data() const
Definition: TensorMorphing.h:900
array< Index, NumDims > m_inputStrides
Definition: TensorMorphing.h:933
DSizes< Index, NumDims > m_offsets
Definition: TensorMorphing.h:939
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
EIGEN_DEVICE_FUNC EvaluatorPointerType data() const
Definition: TensorEvaluator.h:165
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
Definition: TensorEvaluator.h:89
internal::TensorMaterializedBlock< ScalarNoConst, NumCoords, Layout, Index > TensorBlock
Definition: TensorEvaluator.h:63
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions & dimensions() const
Definition: TensorEvaluator.h:69
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock block(TensorBlockDesc &desc, TensorBlockScratch &scratch, bool=false) const
Definition: TensorEvaluator.h:147
Definition: TensorMorphing.h:319
EIGEN_DEVICE_FUNC MemcpyTriggerForSlicing(const Device &device)
Definition: TensorMorphing.h:320
EIGEN_DEVICE_FUNC bool operator()(Index total, Index contiguous) const
Definition: TensorMorphing.h:321
Index threshold_
Definition: TensorMorphing.h:327
Definition: TensorBlock.h:75
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlockResourceRequirements any()
Definition: TensorBlock.h:143
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlockResourceRequirements merge(const TensorBlockResourceRequirements &lhs, const TensorBlockResourceRequirements &rhs)
Definition: TensorBlock.h:129
const TensorReshapingOp< NewDimensions, XprType > EIGEN_DEVICE_REF type
Definition: TensorMorphing.h:41
const TensorSlicingOp< StartIndices, Sizes, XprType > EIGEN_DEVICE_REF type
Definition: TensorMorphing.h:277
const TensorStridingSlicingOp< StartIndices, StopIndices, Strides, XprType > EIGEN_DEVICE_REF type
Definition: TensorMorphing.h:739
Definition: XprHelper.h:427
TensorReshapingOp< NewDimensions, XprType > type
Definition: TensorMorphing.h:47
TensorSlicingOp< StartIndices, Sizes, XprType > type
Definition: TensorMorphing.h:283
TensorStridingSlicingOp< StartIndices, StopIndices, Strides, XprType > type
Definition: TensorMorphing.h:745
Definition: TensorTraits.h:152
ref_selector< T >::type type
Definition: TensorTraits.h:153
XprType::Scalar Scalar
Definition: TensorMorphing.h:28
std::remove_reference_t< Nested > Nested_
Definition: TensorMorphing.h:33
XprTraits::StorageKind StorageKind
Definition: TensorMorphing.h:30
XprType::Nested Nested
Definition: TensorMorphing.h:32
XprTraits::PointerType PointerType
Definition: TensorMorphing.h:36
traits< XprType > XprTraits
Definition: TensorMorphing.h:29
XprTraits::Index Index
Definition: TensorMorphing.h:31
XprType::Scalar Scalar
Definition: TensorMorphing.h:264
XprType::Nested Nested
Definition: TensorMorphing.h:268
std::remove_reference_t< Nested > Nested_
Definition: TensorMorphing.h:269
XprTraits::StorageKind StorageKind
Definition: TensorMorphing.h:266
XprTraits::PointerType PointerType
Definition: TensorMorphing.h:272
XprTraits::Index Index
Definition: TensorMorphing.h:267
traits< XprType > XprTraits
Definition: TensorMorphing.h:265
XprTraits::Index Index
Definition: TensorMorphing.h:729
XprType::Nested Nested
Definition: TensorMorphing.h:730
std::remove_reference_t< Nested > Nested_
Definition: TensorMorphing.h:731
XprTraits::PointerType PointerType
Definition: TensorMorphing.h:734
XprType::Scalar Scalar
Definition: TensorMorphing.h:726
XprTraits::StorageKind StorageKind
Definition: TensorMorphing.h:728
traits< XprType > XprTraits
Definition: TensorMorphing.h:727
Definition: ForwardDeclarations.h:21
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2