Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ > Class Template Reference

#include <TensorContractionMapper.h>

+ Inheritance diagram for Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >:

Public Types

enum  { DirectOffsets = CoeffLoader<Tensor, Tensor::RawAccess, MakePointer_>::DirectOffsets }
 

Public Member Functions

EIGEN_DEVICE_FUNC SimpleTensorContractionMapper (const Tensor &tensor, const nocontract_t &nocontract_strides, const nocontract_t &ij_strides, const contract_t &contract_strides, const contract_t &k_strides)
 
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void offsetBuffer (typename Tensor::Index offset)
 
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void prefetch (Index)
 
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator() (Index row) const
 
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator() (Index row, Index col) const
 
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index computeIndex (Index row, Index col) const
 
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE IndexPair< IndexcomputeIndexPair (Index row, Index col, const Index distance) const
 
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Index firstAligned (Index size) const
 
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Index stride () const
 
const CoeffLoader< Tensor, Tensor::RawAccess, MakePointer_ > & tensor () const
 
const nocontract_t & nocontract_strides () const
 
const nocontract_t & ij_strides () const
 
const contract_t & contract_strides () const
 
const contract_t & k_strides () const
 

Protected Attributes

CoeffLoader< Tensor, Tensor::RawAccess, MakePointer_ > m_tensor
 
const nocontract_t m_nocontract_strides
 
const nocontract_t m_ij_strides
 
const contract_t m_contract_strides
 
const contract_t m_k_strides
 

Member Enumeration Documentation

◆ anonymous enum

template<typename Scalar , typename Index , int side, typename Tensor , typename nocontract_t , typename contract_t , int packet_size, bool inner_dim_contiguous, int Alignment, template< class > class MakePointer_ = MakePointer>
anonymous enum
Enumerator
DirectOffsets 
@ DirectOffsets
Definition: TensorContractionMapper.h:103
@ DirectOffsets
Definition: TensorContractionMapper.h:37

Constructor & Destructor Documentation

◆ SimpleTensorContractionMapper()

template<typename Scalar , typename Index , int side, typename Tensor , typename nocontract_t , typename contract_t , int packet_size, bool inner_dim_contiguous, int Alignment, template< class > class MakePointer_ = MakePointer>
EIGEN_DEVICE_FUNC Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::SimpleTensorContractionMapper ( const Tensor tensor,
const nocontract_t &  nocontract_strides,
const nocontract_t &  ij_strides,
const contract_t &  contract_strides,
const contract_t &  k_strides 
)
inline
97  : m_tensor(tensor),
const contract_t m_k_strides
Definition: TensorContractionMapper.h:232
const nocontract_t & ij_strides() const
Definition: TensorContractionMapper.h:223
CoeffLoader< Tensor, Tensor::RawAccess, MakePointer_ > m_tensor
Definition: TensorContractionMapper.h:228
const nocontract_t m_nocontract_strides
Definition: TensorContractionMapper.h:229
const contract_t & contract_strides() const
Definition: TensorContractionMapper.h:224
const CoeffLoader< Tensor, Tensor::RawAccess, MakePointer_ > & tensor() const
Definition: TensorContractionMapper.h:220
const contract_t m_contract_strides
Definition: TensorContractionMapper.h:231
const contract_t & k_strides() const
Definition: TensorContractionMapper.h:225
const nocontract_t m_ij_strides
Definition: TensorContractionMapper.h:230
const nocontract_t & nocontract_strides() const
Definition: TensorContractionMapper.h:222

Member Function Documentation

◆ computeIndex()

template<typename Scalar , typename Index , int side, typename Tensor , typename nocontract_t , typename contract_t , int packet_size, bool inner_dim_contiguous, int Alignment, template< class > class MakePointer_ = MakePointer>
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::computeIndex ( Index  row,
Index  col 
) const
inline
120  {
121  const bool left = (side == Lhs);
122  EIGEN_UNUSED_VARIABLE(left); // annoying bug in g++8.1: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85963
123  Index nocontract_val = left ? row : col;
124  Index linidx = 0;
126  for (int i = static_cast<int>(array_size<nocontract_t>::value) - 1; i > 0; i--) {
127  const Index idx = nocontract_val / m_ij_strides[i];
128  linidx += idx * m_nocontract_strides[i];
129  nocontract_val -= idx * m_ij_strides[i];
130  }
132  if (side == Lhs && inner_dim_contiguous) {
134  linidx += nocontract_val;
135  } else {
136  linidx += nocontract_val * m_nocontract_strides[0];
137  }
138  }
139 
140  Index contract_val = left ? col : row;
143  for (int i = static_cast<int>(array_size<contract_t>::value) - 1; i > 0; i--) {
144  const Index idx = contract_val / m_k_strides[i];
145  linidx += idx * m_contract_strides[i];
146  contract_val -= idx * m_k_strides[i];
147  }
148 
149  if (side == Rhs && inner_dim_contiguous) {
151  linidx += contract_val;
152  } else {
153  linidx += contract_val * m_contract_strides[0];
154  }
155  }
156 
157  return linidx;
158  }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
#define EIGEN_UNROLL_LOOP
Definition: Macros.h:1298
#define EIGEN_UNUSED_VARIABLE(var)
Definition: Macros.h:966
#define eigen_assert(x)
Definition: Macros.h:910
m col(1)
m row(1)
const char * side
Definition: level3_impl.h:101
@ Lhs
Definition: TensorContractionMapper.h:20
@ Rhs
Definition: TensorContractionMapper.h:20
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
static constexpr Index value
Definition: Meta.h:306

References col(), eigen_assert, EIGEN_UNROLL_LOOP, EIGEN_UNUSED_VARIABLE, i, Eigen::internal::Lhs, Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::m_contract_strides, Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::m_ij_strides, Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::m_k_strides, Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::m_nocontract_strides, Eigen::internal::Rhs, row(), and side.

Referenced by Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::operator()().

◆ computeIndexPair()

template<typename Scalar , typename Index , int side, typename Tensor , typename nocontract_t , typename contract_t , int packet_size, bool inner_dim_contiguous, int Alignment, template< class > class MakePointer_ = MakePointer>
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE IndexPair<Index> Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::computeIndexPair ( Index  row,
Index  col,
const Index  distance 
) const
inline
161  {
162  const bool left = (side == Lhs);
163  EIGEN_UNUSED_VARIABLE(left); // annoying bug in g++8.1: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85963
164  Index nocontract_val[2] = {left ? row : col, left ? row + distance : col};
165  Index linidx[2] = {0, 0};
168  for (int i = static_cast<int>(array_size<nocontract_t>::value) - 1; i > 0; i--) {
169  const Index idx0 = nocontract_val[0] / m_ij_strides[i];
170  const Index idx1 = nocontract_val[1] / m_ij_strides[i];
171  linidx[0] += idx0 * m_nocontract_strides[i];
172  linidx[1] += idx1 * m_nocontract_strides[i];
173  nocontract_val[0] -= idx0 * m_ij_strides[i];
174  nocontract_val[1] -= idx1 * m_ij_strides[i];
175  }
176  if (side == Lhs && inner_dim_contiguous) {
178  linidx[0] += nocontract_val[0];
179  linidx[1] += nocontract_val[1];
180  } else {
181  linidx[0] += nocontract_val[0] * m_nocontract_strides[0];
182  linidx[1] += nocontract_val[1] * m_nocontract_strides[0];
183  }
184  }
185 
186  Index contract_val[2] = {left ? col : row, left ? col : row + distance};
189  for (int i = static_cast<int>(array_size<contract_t>::value) - 1; i > 0; i--) {
190  const Index idx0 = contract_val[0] / m_k_strides[i];
191  const Index idx1 = contract_val[1] / m_k_strides[i];
192  linidx[0] += idx0 * m_contract_strides[i];
193  linidx[1] += idx1 * m_contract_strides[i];
194  contract_val[0] -= idx0 * m_k_strides[i];
195  contract_val[1] -= idx1 * m_k_strides[i];
196  }
197 
198  if (side == Rhs && inner_dim_contiguous) {
200  linidx[0] += contract_val[0];
201  linidx[1] += contract_val[1];
202  } else {
203  linidx[0] += contract_val[0] * m_contract_strides[0];
204  linidx[1] += contract_val[1] * m_contract_strides[0];
205  }
206  }
207  return IndexPair<Index>(linidx[0], linidx[1]);
208  }

References col(), eigen_assert, EIGEN_UNROLL_LOOP, EIGEN_UNUSED_VARIABLE, i, Eigen::internal::Lhs, Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::m_contract_strides, Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::m_ij_strides, Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::m_k_strides, Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::m_nocontract_strides, Eigen::internal::Rhs, row(), and side.

◆ contract_strides()

template<typename Scalar , typename Index , int side, typename Tensor , typename nocontract_t , typename contract_t , int packet_size, bool inner_dim_contiguous, int Alignment, template< class > class MakePointer_ = MakePointer>
const contract_t& Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::contract_strides ( ) const
inline

◆ firstAligned()

template<typename Scalar , typename Index , int side, typename Tensor , typename nocontract_t , typename contract_t , int packet_size, bool inner_dim_contiguous, int Alignment, template< class > class MakePointer_ = MakePointer>
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Index Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::firstAligned ( Index  size) const
inline
210  {
211  // Only claim alignment when we can compute the actual stride (ie when we're
212  // dealing with the lhs with inner_dim_contiguous. This is because the
213  // matrix-vector product relies on the stride when dealing with aligned inputs.
214  return (Alignment == Aligned) && (side == Lhs) && inner_dim_contiguous ? 0 : size;
215  }
Scalar Scalar int size
Definition: benchVecAdd.cpp:17
@ Aligned
Definition: Constants.h:242

References Eigen::Aligned, Eigen::internal::Lhs, side, and size.

◆ ij_strides()

template<typename Scalar , typename Index , int side, typename Tensor , typename nocontract_t , typename contract_t , int packet_size, bool inner_dim_contiguous, int Alignment, template< class > class MakePointer_ = MakePointer>
const nocontract_t& Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::ij_strides ( ) const
inline

◆ k_strides()

template<typename Scalar , typename Index , int side, typename Tensor , typename nocontract_t , typename contract_t , int packet_size, bool inner_dim_contiguous, int Alignment, template< class > class MakePointer_ = MakePointer>
const contract_t& Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::k_strides ( ) const
inline

◆ nocontract_strides()

template<typename Scalar , typename Index , int side, typename Tensor , typename nocontract_t , typename contract_t , int packet_size, bool inner_dim_contiguous, int Alignment, template< class > class MakePointer_ = MakePointer>
const nocontract_t& Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::nocontract_strides ( ) const
inline

◆ offsetBuffer()

template<typename Scalar , typename Index , int side, typename Tensor , typename nocontract_t , typename contract_t , int packet_size, bool inner_dim_contiguous, int Alignment, template< class > class MakePointer_ = MakePointer>
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::offsetBuffer ( typename Tensor::Index  offset)
inline

◆ operator()() [1/2]

template<typename Scalar , typename Index , int side, typename Tensor , typename nocontract_t , typename contract_t , int packet_size, bool inner_dim_contiguous, int Alignment, template< class > class MakePointer_ = MakePointer>
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::operator() ( Index  row) const
inline
111  {
112  // column major assumption
113  return operator()(row, 0);
114  }
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(Index row) const
Definition: TensorContractionMapper.h:111

References row().

◆ operator()() [2/2]

template<typename Scalar , typename Index , int side, typename Tensor , typename nocontract_t , typename contract_t , int packet_size, bool inner_dim_contiguous, int Alignment, template< class > class MakePointer_ = MakePointer>
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::operator() ( Index  row,
Index  col 
) const
inline

◆ prefetch()

template<typename Scalar , typename Index , int side, typename Tensor , typename nocontract_t , typename contract_t , int packet_size, bool inner_dim_contiguous, int Alignment, template< class > class MakePointer_ = MakePointer>
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::prefetch ( Index  )
inline
109 {}

◆ stride()

◆ tensor()

template<typename Scalar , typename Index , int side, typename Tensor , typename nocontract_t , typename contract_t , int packet_size, bool inner_dim_contiguous, int Alignment, template< class > class MakePointer_ = MakePointer>
const CoeffLoader<Tensor, Tensor::RawAccess, MakePointer_>& Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::tensor ( ) const
inline

Member Data Documentation

◆ m_contract_strides

◆ m_ij_strides

◆ m_k_strides

◆ m_nocontract_strides

◆ m_tensor


The documentation for this class was generated from the following file: