10#ifndef EIGEN_CXX11_TENSOR_TENSOR_STRIDING_H
11#define EIGEN_CXX11_TENSOR_TENSOR_STRIDING_H
23template<
typename Str
ides,
typename XprType>
26 typedef typename XprType::Scalar
Scalar;
29 typedef typename XprTraits::Index
Index;
30 typedef typename XprType::Nested
Nested;
32 static const int NumDimensions = XprTraits::NumDimensions;
33 static const int Layout = XprTraits::Layout;
37template<
typename Str
ides,
typename XprType>
43template<
typename Str
ides,
typename XprType>
53template<
typename Str
ides,
typename XprType>
84template<
typename Str
ides,
typename ArgType,
typename Device>
113 : m_impl(op.expression(), device)
115 m_dimensions = m_impl.dimensions();
116 for (
int i = 0;
i < NumDims; ++
i) {
122 m_outputStrides[0] = 1;
123 m_inputStrides[0] = 1;
124 for (
int i = 1;
i < NumDims; ++
i) {
125 m_outputStrides[
i] = m_outputStrides[
i-1] * m_dimensions[
i-1];
126 m_inputStrides[
i] = m_inputStrides[
i-1] * input_dims[
i-1];
127 m_inputStrides[
i-1] *= op.
strides()[
i-1];
129 m_inputStrides[NumDims-1] *= op.
strides()[NumDims-1];
131 m_outputStrides[NumDims-1] = 1;
132 m_inputStrides[NumDims-1] = 1;
133 for (
int i = NumDims - 2;
i >= 0; --
i) {
134 m_outputStrides[
i] = m_outputStrides[
i+1] * m_dimensions[
i+1];
135 m_inputStrides[
i] = m_inputStrides[
i+1] * input_dims[
i+1];
136 m_inputStrides[
i+1] *= op.
strides()[
i+1];
138 m_inputStrides[0] *= op.
strides()[0];
146 m_impl.evalSubExprsIfNeeded(NULL);
155 return m_impl.coeff(srcCoeff(index));
158 template<
int LoadMode>
164 Index inputIndices[] = {0, 0};
168 for (
int i = NumDims - 1;
i > 0; --
i) {
169 const Index idx0 = indices[0] / m_outputStrides[
i];
170 const Index idx1 = indices[1] / m_outputStrides[
i];
171 inputIndices[0] += idx0 * m_inputStrides[
i];
172 inputIndices[1] += idx1 * m_inputStrides[
i];
173 indices[0] -= idx0 * m_outputStrides[
i];
174 indices[1] -= idx1 * m_outputStrides[
i];
176 inputIndices[0] += indices[0] * m_inputStrides[0];
177 inputIndices[1] += indices[1] * m_inputStrides[0];
180 for (
int i = 0;
i < NumDims - 1; ++
i) {
181 const Index idx0 = indices[0] / m_outputStrides[
i];
182 const Index idx1 = indices[1] / m_outputStrides[
i];
183 inputIndices[0] += idx0 * m_inputStrides[
i];
184 inputIndices[1] += idx1 * m_inputStrides[
i];
185 indices[0] -= idx0 * m_outputStrides[
i];
186 indices[1] -= idx1 * m_outputStrides[
i];
188 inputIndices[0] += indices[0] * m_inputStrides[NumDims-1];
189 inputIndices[1] += indices[1] * m_inputStrides[NumDims-1];
191 if (inputIndices[1] - inputIndices[0] ==
PacketSize - 1) {
197 values[0] = m_impl.coeff(inputIndices[0]);
198 values[
PacketSize-1] = m_impl.coeff(inputIndices[1]);
209 double compute_cost = (NumDims - 1) * (TensorOpCost::AddCost<Index>() +
210 TensorOpCost::MulCost<Index>() +
211 TensorOpCost::DivCost<Index>()) +
212 TensorOpCost::MulCost<Index>();
216 const int innerDim = (
static_cast<int>(
Layout) ==
static_cast<int>(
ColMajor)) ? 0 : (NumDims - 1);
217 return m_impl.costPerCoeff(vectorized && m_inputStrides[innerDim] == 1) +
233 Index inputIndex = 0;
236 for (
int i = NumDims - 1;
i > 0; --
i) {
237 const Index idx = index / m_outputStrides[
i];
238 inputIndex += idx * m_inputStrides[
i];
239 index -= idx * m_outputStrides[
i];
241 inputIndex += index * m_inputStrides[0];
244 for (
int i = 0;
i < NumDims - 1; ++
i) {
245 const Index idx = index / m_outputStrides[
i];
246 inputIndex += idx * m_inputStrides[
i];
247 index -= idx * m_outputStrides[
i];
249 inputIndex += index * m_inputStrides[NumDims-1];
261template<
typename Str
ides,
typename ArgType,
typename Device>
263 :
public TensorEvaluator<const TensorStridingOp<Strides, ArgType>, Device>
281 :
Base(op, device) { }
291 return this->m_impl.coeffRef(this->srcCoeff(index));
300 Index inputIndices[] = {0, 0};
304 for (
int i = NumDims - 1;
i > 0; --
i) {
305 const Index idx0 = indices[0] / this->m_outputStrides[
i];
306 const Index idx1 = indices[1] / this->m_outputStrides[
i];
307 inputIndices[0] += idx0 * this->m_inputStrides[
i];
308 inputIndices[1] += idx1 * this->m_inputStrides[
i];
309 indices[0] -= idx0 * this->m_outputStrides[
i];
310 indices[1] -= idx1 * this->m_outputStrides[
i];
312 inputIndices[0] += indices[0] * this->m_inputStrides[0];
313 inputIndices[1] += indices[1] * this->m_inputStrides[0];
316 for (
int i = 0;
i < NumDims - 1; ++
i) {
317 const Index idx0 = indices[0] / this->m_outputStrides[
i];
318 const Index idx1 = indices[1] / this->m_outputStrides[
i];
319 inputIndices[0] += idx0 * this->m_inputStrides[
i];
320 inputIndices[1] += idx1 * this->m_inputStrides[
i];
321 indices[0] -= idx0 * this->m_outputStrides[
i];
322 indices[1] -= idx1 * this->m_outputStrides[
i];
324 inputIndices[0] += indices[0] * this->m_inputStrides[NumDims-1];
325 inputIndices[1] += indices[1] * this->m_inputStrides[NumDims-1];
327 if (inputIndices[1] - inputIndices[0] ==
PacketSize - 1) {
328 this->m_impl.template writePacket<Unaligned>(inputIndices[0],
x);
333 this->m_impl.coeffRef(inputIndices[0]) = values[0];
334 this->m_impl.coeffRef(inputIndices[1]) = values[
PacketSize-1];
int i
Definition BiCGSTAB_step_by_step.cpp:9
#define EIGEN_UNROLL_LOOP
Definition Macros.h:1461
#define EIGEN_DEVICE_FUNC
Definition Macros.h:976
#define eigen_assert(x)
Definition Macros.h:1037
#define EIGEN_STRONG_INLINE
Definition Macros.h:917
#define EIGEN_STATIC_ASSERT(CONDITION, MSG)
Definition StaticAssert.h:127
#define EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(Derived)
Definition TensorMacros.h:94
#define EIGEN_DEVICE_REF
Definition TensorMacros.h:50
Generic expression where a coefficient-wise binary operator is applied to two expressions.
Definition CwiseBinaryOp.h:84
The tensor base class.
Definition TensorBase.h:973
Definition TensorCostModel.h:25
Definition TensorStriding.h:55
XprType::CoeffReturnType CoeffReturnType
Definition TensorStriding.h:60
TensorBase< TensorStridingOp< Strides, XprType > > Base
Definition TensorStriding.h:57
Eigen::internal::traits< TensorStridingOp >::Index Index
Definition TensorStriding.h:63
Eigen::internal::traits< TensorStridingOp >::StorageKind StorageKind
Definition TensorStriding.h:62
XprType::Nested m_xpr
Definition TensorStriding.h:78
Eigen::internal::traits< TensorStridingOp >::Scalar Scalar
Definition TensorStriding.h:58
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorStridingOp(const XprType &expr, const Strides &dims)
Definition TensorStriding.h:65
const Strides m_dims
Definition TensorStriding.h:79
EIGEN_DEVICE_FUNC const Strides & strides() const
Definition TensorStriding.h:69
Eigen::internal::nested< TensorStridingOp >::type Nested
Definition TensorStriding.h:61
EIGEN_DEVICE_FUNC const internal::remove_all< typenameXprType::Nested >::type & expression() const
Definition TensorStriding.h:73
Eigen::NumTraits< Scalar >::Real RealScalar
Definition TensorStriding.h:59
Definition EmulateArray.h:21
Definition TensorBlock.h:617
Definition TensorRef.h:81
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy x
Definition gnuplot_common_settings.hh:12
@ ColMajor
Definition Constants.h:319
EIGEN_DEVICE_FUNC T() ceil(const T &x)
Definition MathFunctions.h:1420
Namespace containing all symbols from the Eigen library.
Definition bench_norm.cpp:85
Definition BandTriangularSolver.h:13
Definition TensorDimensions.h:263
Definition Constants.h:507
Definition TensorMeta.h:50
Definition TensorForwardDeclarations.h:37
PacketType< CoeffReturnType, Device >::type PacketReturnType
Definition TensorStriding.h:286
XprType::CoeffReturnType CoeffReturnType
Definition TensorStriding.h:285
XprType::Index Index
Definition TensorStriding.h:283
EIGEN_STRONG_INLINE TensorEvaluator(const XprType &op, const Device &device)
Definition TensorStriding.h:280
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writePacket(Index index, const PacketReturnType &x)
Definition TensorStriding.h:295
TensorStridingOp< Strides, ArgType > XprType
Definition TensorStriding.h:265
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar & coeffRef(Index index)
Definition TensorStriding.h:289
XprType::Scalar Scalar
Definition TensorStriding.h:284
TensorEvaluator< const XprType, Device > Base
Definition TensorStriding.h:266
EIGEN_STRONG_INLINE TensorEvaluator(const XprType &op, const Device &device)
Definition TensorStriding.h:112
array< Index, NumDims > m_inputStrides
Definition TensorStriding.h:256
StorageMemory< CoeffReturnType, Device > Storage
Definition TensorStriding.h:95
EIGEN_STRONG_INLINE void cleanup()
Definition TensorStriding.h:149
TensorEvaluator< ArgType, Device > m_impl
Definition TensorStriding.h:257
TensorStridingOp< Strides, ArgType > XprType
Definition TensorStriding.h:87
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
Definition TensorStriding.h:159
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
Definition TensorStriding.h:153
XprType::Scalar Scalar
Definition TensorStriding.h:91
XprType::CoeffReturnType CoeffReturnType
Definition TensorStriding.h:92
Storage::Type EvaluatorPointerType
Definition TensorStriding.h:96
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const
Definition TensorStriding.h:208
PacketType< CoeffReturnType, Device >::type PacketReturnType
Definition TensorStriding.h:93
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index srcCoeff(Index index) const
Definition TensorStriding.h:231
Dimensions m_dimensions
Definition TensorStriding.h:254
XprType::Index Index
Definition TensorStriding.h:88
DSizes< Index, NumDims > Dimensions
Definition TensorStriding.h:90
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions & dimensions() const
Definition TensorStriding.h:143
EIGEN_DEVICE_FUNC Storage::Type data() const
Definition TensorStriding.h:222
EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType)
Definition TensorStriding.h:145
internal::TensorBlockNotImplemented TensorBlock
Definition TensorStriding.h:109
array< Index, NumDims > m_outputStrides
Definition TensorStriding.h:255
A cost model used to limit the number of threads used for evaluating tensor expression.
Definition TensorEvaluator.h:29
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType & coeffRef(Index index)
Definition TensorEvaluator.h:99
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions & dimensions() const
Definition TensorEvaluator.h:73
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
Definition TensorEvaluator.h:94
@ BlockAccess
Definition TensorEvaluator.h:48
@ PreferBlockAccess
Definition TensorEvaluator.h:49
@ PacketAccess
Definition TensorEvaluator.h:47
@ Layout
Definition TensorEvaluator.h:50
@ IsAligned
Definition TensorEvaluator.h:46
Derived::Dimensions Dimensions
Definition TensorEvaluator.h:34
static const int PacketSize
Definition TensorEvaluator.h:36
const TensorStridingOp< Strides, XprType > EIGEN_DEVICE_REF type
Definition TensorStriding.h:40
Definition XprHelper.h:332
TensorStridingOp< Strides, XprType > type
Definition TensorStriding.h:46
Definition TensorTraits.h:175
remove_reference< Nested >::type _Nested
Definition TensorStriding.h:31
XprTraits::PointerType PointerType
Definition TensorStriding.h:34
traits< XprType > XprTraits
Definition TensorStriding.h:27
XprTraits::Index Index
Definition TensorStriding.h:29
XprType::Scalar Scalar
Definition TensorStriding.h:26
XprType::Nested Nested
Definition TensorStriding.h:30
XprTraits::StorageKind StorageKind
Definition TensorStriding.h:28
Definition ForwardDeclarations.h:17