10#ifndef EIGEN_CXX11_TENSOR_TENSOR_EVAL_TO_H
11#define EIGEN_CXX11_TENSOR_TENSOR_EVAL_TO_H
16template<
typename XprType,
template <
class>
class MakePointer_>
17struct traits<TensorEvalToOp<XprType, MakePointer_> >
20 typedef typename XprType::Scalar Scalar;
21 typedef traits<XprType> XprTraits;
22 typedef typename XprTraits::StorageKind StorageKind;
23 typedef typename XprTraits::Index
Index;
24 typedef typename XprType::Nested Nested;
25 typedef typename remove_reference<Nested>::type _Nested;
26 static const int NumDimensions = XprTraits::NumDimensions;
27 static const int Layout = XprTraits::Layout;
28 typedef typename MakePointer_<Scalar>::Type PointerType;
36 typedef MakePointer_<T> MakePointerT;
37 typedef typename MakePointerT::Type Type;
43template<
typename XprType,
template <
class>
class MakePointer_>
44struct eval<TensorEvalToOp<XprType, MakePointer_>, Eigen::Dense>
46 typedef const TensorEvalToOp<XprType, MakePointer_>& type;
49template<
typename XprType,
template <
class>
class MakePointer_>
50struct nested<TensorEvalToOp<XprType, MakePointer_>, 1, typename eval<TensorEvalToOp<XprType, MakePointer_> >::type>
52 typedef TensorEvalToOp<XprType, MakePointer_> type;
60template<
typename XprType,
template <
class>
class MakePointer_>
61class TensorEvalToOp :
public TensorBase<TensorEvalToOp<XprType, MakePointer_>, ReadOnlyAccessors>
64 typedef typename Eigen::internal::traits<TensorEvalToOp>::Scalar Scalar;
65 typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
66 typedef typename internal::remove_const<typename XprType::CoeffReturnType>::type CoeffReturnType;
67 typedef typename MakePointer_<CoeffReturnType>::Type PointerType;
68 typedef typename Eigen::internal::nested<TensorEvalToOp>::type Nested;
69 typedef typename Eigen::internal::traits<TensorEvalToOp>::StorageKind StorageKind;
70 typedef typename Eigen::internal::traits<TensorEvalToOp>::Index Index;
72 static const int NumDims = Eigen::internal::traits<TensorEvalToOp>::NumDimensions;
74 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvalToOp(PointerType buffer,
const XprType& expr)
75 : m_xpr(expr), m_buffer(buffer) {}
78 const typename internal::remove_all<typename XprType::Nested>::type&
79 expression()
const {
return m_xpr; }
81 EIGEN_DEVICE_FUNC PointerType buffer()
const {
return m_buffer; }
84 typename XprType::Nested m_xpr;
90template<
typename ArgType,
typename Device,
template <
class>
class MakePointer_>
91struct TensorEvaluator<const TensorEvalToOp<ArgType, MakePointer_>, Device>
93 typedef TensorEvalToOp<ArgType, MakePointer_> XprType;
94 typedef typename ArgType::Scalar Scalar;
95 typedef typename TensorEvaluator<ArgType, Device>::Dimensions Dimensions;
96 typedef typename XprType::Index Index;
97 typedef typename internal::remove_const<typename XprType::CoeffReturnType>::type CoeffReturnType;
98 typedef typename PacketType<CoeffReturnType, Device>::type PacketReturnType;
99 static const int PacketSize = PacketType<CoeffReturnType, Device>::size;
100 typedef typename Eigen::internal::traits<XprType>::PointerType TensorPointerType;
101 typedef StorageMemory<CoeffReturnType, Device> Storage;
102 typedef typename Storage::Type EvaluatorPointerType;
104 IsAligned = TensorEvaluator<ArgType, Device>::IsAligned,
105 PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
107 PreferBlockAccess =
false,
108 Layout = TensorEvaluator<ArgType, Device>::Layout,
113 static const int NumDims = internal::traits<ArgType>::NumDimensions;
116 typedef internal::TensorBlockDescriptor<NumDims, Index> TensorBlockDesc;
117 typedef internal::TensorBlockScratchAllocator<Device> TensorBlockScratch;
119 typedef typename TensorEvaluator<const ArgType, Device>::TensorBlock
122 typedef internal::TensorBlockAssignment<
123 CoeffReturnType, NumDims,
typename ArgTensorBlock::XprType, Index>
124 TensorBlockAssignment;
127 EIGEN_STRONG_INLINE TensorEvaluator(
const XprType& op,
const Device& device)
128 : m_impl(op.expression(), device), m_buffer(device.get(op.buffer())), m_expression(op.expression()){}
131 EIGEN_STRONG_INLINE ~TensorEvaluator() {
135 EIGEN_DEVICE_FUNC
const Dimensions& dimensions()
const {
return m_impl.dimensions(); }
137 EIGEN_STRONG_INLINE
bool evalSubExprsIfNeeded(EvaluatorPointerType scalar) {
138 EIGEN_UNUSED_VARIABLE(scalar);
139 eigen_assert(scalar == NULL);
140 return m_impl.evalSubExprsIfNeeded(m_buffer);
143#ifdef EIGEN_USE_THREADS
144 template <
typename EvalSubExprsCallback>
145 EIGEN_STRONG_INLINE
void evalSubExprsIfNeededAsync(
146 EvaluatorPointerType scalar, EvalSubExprsCallback done) {
147 EIGEN_UNUSED_VARIABLE(scalar);
148 eigen_assert(scalar == NULL);
149 m_impl.evalSubExprsIfNeededAsync(m_buffer, std::move(done));
153 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void evalScalar(Index i) {
154 m_buffer[i] = m_impl.coeff(i);
156 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void evalPacket(Index i) {
157 internal::pstoret<CoeffReturnType, PacketReturnType, Aligned>(m_buffer + i, m_impl.template packet<TensorEvaluator<ArgType, Device>::IsAligned ?
Aligned :
Unaligned>(i));
160 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
161 internal::TensorBlockResourceRequirements getResourceRequirements()
const {
162 return m_impl.getResourceRequirements();
165 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void evalBlock(
166 TensorBlockDesc& desc, TensorBlockScratch& scratch) {
168 desc.template AddDestinationBuffer<Layout>(
169 m_buffer + desc.offset(),
170 internal::strides<Layout>(m_impl.dimensions()));
172 ArgTensorBlock block =
173 m_impl.block(desc, scratch,
true);
177 if (block.kind() != internal::TensorBlockKind::kMaterializedInOutput) {
178 TensorBlockAssignment::Run(
179 TensorBlockAssignment::target(
180 desc.dimensions(), internal::strides<Layout>(m_impl.dimensions()),
181 m_buffer, desc.offset()),
187 EIGEN_STRONG_INLINE
void cleanup() {
191 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index)
const
193 return m_buffer[index];
196 template<
int LoadMode>
197 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index)
const
199 return internal::ploadt<PacketReturnType, LoadMode>(m_buffer + index);
202 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(
bool vectorized)
const {
205 return m_impl.costPerCoeff(vectorized) +
206 TensorOpCost(0,
sizeof(CoeffReturnType), 0, vectorized, PacketSize);
209 EIGEN_DEVICE_FUNC EvaluatorPointerType data()
const {
return m_buffer; }
210 ArgType expression()
const {
return m_expression; }
211 #ifdef EIGEN_USE_SYCL
213 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void bind(cl::sycl::handler &cgh)
const {
221 TensorEvaluator<ArgType, Device> m_impl;
222 EvaluatorPointerType m_buffer;
223 const ArgType m_expression;
The tensor base class.
Definition TensorForwardDeclarations.h:56
Namespace containing all symbols from the Eigen library.
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The tensor evaluator class.
Definition TensorEvaluator.h:27