10#ifndef EIGEN_CXX11_TENSOR_TENSOR_EVAL_TO_H
11#define EIGEN_CXX11_TENSOR_TENSOR_EVAL_TO_H
23template<
typename XprType,
template <
class>
class MakePointer_>
24struct traits<TensorEvalToOp<XprType, MakePointer_> >
27 typedef typename XprType::Scalar Scalar;
28 typedef traits<XprType> XprTraits;
29 typedef typename XprTraits::StorageKind StorageKind;
30 typedef typename XprTraits::Index
Index;
31 typedef typename XprType::Nested Nested;
32 typedef typename remove_reference<Nested>::type _Nested;
33 static const int NumDimensions = XprTraits::NumDimensions;
34 static const int Layout = XprTraits::Layout;
35 typedef typename MakePointer_<Scalar>::Type PointerType;
43 typedef MakePointer_<T> MakePointerT;
44 typedef typename MakePointerT::Type Type;
50template<
typename XprType,
template <
class>
class MakePointer_>
51struct eval<TensorEvalToOp<XprType, MakePointer_>,
Eigen::Dense>
53 typedef const TensorEvalToOp<XprType, MakePointer_>& type;
56template<
typename XprType,
template <
class>
class MakePointer_>
57struct nested<TensorEvalToOp<XprType, MakePointer_>, 1, typename eval<TensorEvalToOp<XprType, MakePointer_> >::type>
59 typedef TensorEvalToOp<XprType, MakePointer_> type;
67template<
typename XprType,
template <
class>
class MakePointer_>
68class TensorEvalToOp :
public TensorBase<TensorEvalToOp<XprType, MakePointer_>, ReadOnlyAccessors>
71 typedef typename Eigen::internal::traits<TensorEvalToOp>::Scalar Scalar;
73 typedef typename internal::remove_const<typename XprType::CoeffReturnType>::type CoeffReturnType;
74 typedef typename MakePointer_<CoeffReturnType>::Type PointerType;
75 typedef typename Eigen::internal::nested<TensorEvalToOp>::type Nested;
76 typedef typename Eigen::internal::traits<TensorEvalToOp>::StorageKind StorageKind;
77 typedef typename Eigen::internal::traits<TensorEvalToOp>::Index
Index;
79 static const int NumDims = Eigen::internal::traits<TensorEvalToOp>::NumDimensions;
81 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvalToOp(PointerType buffer,
const XprType& expr)
82 : m_xpr(expr), m_buffer(buffer) {}
85 const typename internal::remove_all<typename XprType::Nested>::type&
86 expression()
const {
return m_xpr; }
88 EIGEN_DEVICE_FUNC PointerType buffer()
const {
return m_buffer; }
91 typename XprType::Nested m_xpr;
97template<
typename ArgType,
typename Device,
template <
class>
class MakePointer_>
98struct TensorEvaluator<const TensorEvalToOp<ArgType, MakePointer_>, Device>
100 typedef TensorEvalToOp<ArgType, MakePointer_> XprType;
101 typedef typename ArgType::Scalar Scalar;
102 typedef typename TensorEvaluator<ArgType, Device>::Dimensions Dimensions;
103 typedef typename XprType::Index Index;
104 typedef typename internal::remove_const<typename XprType::CoeffReturnType>::type CoeffReturnType;
105 typedef typename PacketType<CoeffReturnType, Device>::type PacketReturnType;
106 static const int PacketSize = PacketType<CoeffReturnType, Device>::size;
107 typedef typename Eigen::internal::traits<XprType>::PointerType TensorPointerType;
108 typedef StorageMemory<CoeffReturnType, Device> Storage;
109 typedef typename Storage::Type EvaluatorPointerType;
111 IsAligned = TensorEvaluator<ArgType, Device>::IsAligned,
112 PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
114 PreferBlockAccess =
false,
115 Layout = TensorEvaluator<ArgType, Device>::Layout,
120 static const int NumDims = internal::traits<ArgType>::NumDimensions;
123 typedef internal::TensorBlockDescriptor<NumDims, Index> TensorBlockDesc;
124 typedef internal::TensorBlockScratchAllocator<Device> TensorBlockScratch;
126 typedef typename TensorEvaluator<const ArgType, Device>::TensorBlock
129 typedef internal::TensorBlockAssignment<
130 CoeffReturnType, NumDims,
typename ArgTensorBlock::XprType,
Index>
131 TensorBlockAssignment;
134 EIGEN_STRONG_INLINE TensorEvaluator(
const XprType& op,
const Device& device)
135 : m_impl(op.expression(), device), m_buffer(device.get(op.buffer())), m_expression(op.expression()){}
138 EIGEN_STRONG_INLINE ~TensorEvaluator() {
142 EIGEN_DEVICE_FUNC
const Dimensions& dimensions()
const {
return m_impl.dimensions(); }
144 EIGEN_STRONG_INLINE
bool evalSubExprsIfNeeded(EvaluatorPointerType scalar) {
145 EIGEN_UNUSED_VARIABLE(scalar);
146 eigen_assert(scalar == NULL);
147 return m_impl.evalSubExprsIfNeeded(m_buffer);
150#ifdef EIGEN_USE_THREADS
151 template <
typename EvalSubExprsCallback>
152 EIGEN_STRONG_INLINE
void evalSubExprsIfNeededAsync(
153 EvaluatorPointerType scalar, EvalSubExprsCallback done) {
154 EIGEN_UNUSED_VARIABLE(scalar);
155 eigen_assert(scalar == NULL);
156 m_impl.evalSubExprsIfNeededAsync(m_buffer, std::move(done));
160 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void evalScalar(Index i) {
161 m_buffer[i] = m_impl.coeff(i);
163 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void evalPacket(Index i) {
164 internal::pstoret<CoeffReturnType, PacketReturnType, Aligned>(m_buffer + i, m_impl.template packet<TensorEvaluator<ArgType, Device>::IsAligned ?
Aligned :
Unaligned>(i));
167 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
168 internal::TensorBlockResourceRequirements getResourceRequirements()
const {
169 return m_impl.getResourceRequirements();
172 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void evalBlock(
173 TensorBlockDesc& desc, TensorBlockScratch& scratch) {
175 desc.template AddDestinationBuffer<Layout>(
176 m_buffer + desc.offset(),
177 internal::strides<Layout>(m_impl.dimensions()));
179 ArgTensorBlock block =
180 m_impl.block(desc, scratch,
true);
184 if (block.kind() != internal::TensorBlockKind::kMaterializedInOutput) {
185 TensorBlockAssignment::Run(
186 TensorBlockAssignment::target(
187 desc.dimensions(), internal::strides<Layout>(m_impl.dimensions()),
188 m_buffer, desc.offset()),
194 EIGEN_STRONG_INLINE
void cleanup() {
198 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index)
const
200 return m_buffer[index];
203 template<
int LoadMode>
204 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index)
const
206 return internal::ploadt<PacketReturnType, LoadMode>(m_buffer + index);
209 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(
bool vectorized)
const {
212 return m_impl.costPerCoeff(vectorized) +
213 TensorOpCost(0,
sizeof(CoeffReturnType), 0, vectorized, PacketSize);
216 EIGEN_DEVICE_FUNC EvaluatorPointerType data()
const {
return m_buffer; }
217 ArgType expression()
const {
return m_expression; }
218 #ifdef EIGEN_USE_SYCL
220 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void bind(cl::sycl::handler &cgh)
const {
228 TensorEvaluator<ArgType, Device> m_impl;
229 EvaluatorPointerType m_buffer;
230 const ArgType m_expression;
Namespace containing all symbols from the Eigen library.
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index