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

#include <TensorContractionMapper.h>

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

Public Types

typedef SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ > ParentMapper
 
- Public Types inherited from Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >
enum  
 

Public Member Functions

EIGEN_DEVICE_FUNC BaseTensorContractionMapper (const Tensor &tensor, const nocontract_t &nocontract_strides, const nocontract_t &ij_strides, const contract_t &contract_strides, const contract_t &k_strides)
 
template<typename PacketT , int AlignmentType>
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::enable_if_t< internal::unpacket_traits< PacketT >::size==packet_size, PacketT > load (Index i, Index j) const
 
template<typename PacketT , int AlignmentType>
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::enable_if_t< internal::unpacket_traits< PacketT >::size !=packet_size, PacketT > load (Index i, Index j) const
 
template<typename PacketT , int AlignmentType>
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketT loadPacket (Index i, Index j) const
 
- Public Member Functions inherited from Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >
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
 

Additional Inherited Members

- Protected Attributes inherited from Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >
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 Typedef Documentation

◆ ParentMapper

template<typename Scalar , typename Index , int side, typename Tensor , typename nocontract_t , typename contract_t , int packet_size, bool inner_dim_contiguous, bool inner_dim_reordered, int Alignment, template< class > class MakePointer_>
typedef SimpleTensorContractionMapper<Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_> Eigen::internal::BaseTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment, MakePointer_ >::ParentMapper

Constructor & Destructor Documentation

◆ BaseTensorContractionMapper()

template<typename Scalar , typename Index , int side, typename Tensor , typename nocontract_t , typename contract_t , int packet_size, bool inner_dim_contiguous, bool inner_dim_reordered, int Alignment, template< class > class MakePointer_>
EIGEN_DEVICE_FUNC Eigen::internal::BaseTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment, MakePointer_ >::BaseTensorContractionMapper ( const Tensor tensor,
const nocontract_t &  nocontract_strides,
const nocontract_t &  ij_strides,
const contract_t &  contract_strides,
const contract_t &  k_strides 
)
inline
SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ > ParentMapper
Definition: TensorContractionMapper.h:244
const CoeffLoader< Tensor, Tensor::RawAccess, MakePointer_ > & tensor() const
Definition: TensorContractionMapper.h:220

Member Function Documentation

◆ load() [1/2]

template<typename Scalar , typename Index , int side, typename Tensor , typename nocontract_t , typename contract_t , int packet_size, bool inner_dim_contiguous, bool inner_dim_reordered, int Alignment, template< class > class MakePointer_>
template<typename PacketT , int AlignmentType>
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::enable_if_t<internal::unpacket_traits<PacketT>::size == packet_size, PacketT> Eigen::internal::BaseTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment, MakePointer_ >::load ( Index  i,
Index  j 
) const
inline
254  {
255  // whole method makes column major assumption
256 
257  // don't need to add offsets for now (because operator handles that)
258  // current code assumes packet size must be a multiple of 2
259  EIGEN_STATIC_ASSERT(packet_size % 2 == 0, YOU_MADE_A_PROGRAMMING_MISTAKE);
260 
261  if (Tensor::PacketAccess && inner_dim_contiguous && !inner_dim_reordered) {
262  const Index index = this->computeIndex(i, j);
263  eigen_assert(this->computeIndex(i + packet_size - 1, j) == index + packet_size - 1);
264  return this->m_tensor.template packet<AlignmentType>(index);
265  }
266 
267  const IndexPair<Index> indexPair = this->computeIndexPair(i, j, packet_size - 1);
268  const Index first = indexPair.first;
269  const Index lastIdx = indexPair.second;
270 
271  // We can always do optimized packet reads from left hand side right now, because
272  // the vertical matrix dimension on the left hand side is never contracting.
273  // On the right hand side we need to check if the contracting dimensions may have
274  // been shuffled first.
275  if (Tensor::PacketAccess && (side == Lhs || internal::array_size<contract_t>::value <= 1 || !inner_dim_reordered) &&
276  (lastIdx - first) == (packet_size - 1)) {
277  return this->m_tensor.template packet<AlignmentType>(first);
278  }
279 
280  EIGEN_ALIGN_MAX Scalar data[packet_size];
281 
282  data[0] = this->m_tensor.coeff(first);
284  for (Index k = 1; k < packet_size - 1; k += 2) {
285  const IndexPair<Index> internal_pair = this->computeIndexPair(i + k, j, 1);
286  data[k] = this->m_tensor.coeff(internal_pair.first);
287  data[k + 1] = this->m_tensor.coeff(internal_pair.second);
288  }
289  data[packet_size - 1] = this->m_tensor.coeff(lastIdx);
290 
291  return pload<PacketT>(data);
292  }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
#define EIGEN_ALIGN_MAX
Definition: ConfigureVectorization.h:146
#define EIGEN_UNROLL_LOOP
Definition: Macros.h:1298
#define eigen_assert(x)
Definition: Macros.h:910
int data[]
Definition: Map_placement_new.cpp:1
#define EIGEN_STATIC_ASSERT(X, MSG)
Definition: StaticAssert.h:26
SCALAR Scalar
Definition: bench_gemm.cpp:45
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index computeIndex(Index row, Index col) const
Definition: TensorContractionMapper.h:120
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE IndexPair< Index > computeIndexPair(Index row, Index col, const Index distance) const
Definition: TensorContractionMapper.h:160
char char char int int * k
Definition: level2_impl.h:374
const char * side
Definition: level3_impl.h:101
@ Lhs
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
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::computeIndex(), Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::computeIndexPair(), data, EIGEN_ALIGN_MAX, eigen_assert, EIGEN_STATIC_ASSERT, EIGEN_UNROLL_LOOP, Eigen::IndexPair< Idx >::first, j, k, Eigen::internal::Lhs, Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::m_tensor, Eigen::IndexPair< Idx >::second, and side.

◆ load() [2/2]

template<typename Scalar , typename Index , int side, typename Tensor , typename nocontract_t , typename contract_t , int packet_size, bool inner_dim_contiguous, bool inner_dim_reordered, int Alignment, template< class > class MakePointer_>
template<typename PacketT , int AlignmentType>
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::enable_if_t<internal::unpacket_traits<PacketT>::size != packet_size, PacketT> Eigen::internal::BaseTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment, MakePointer_ >::load ( Index  i,
Index  j 
) const
inline
297  {
298  const Index requested_packet_size = internal::unpacket_traits<PacketT>::size;
299  EIGEN_ALIGN_MAX Scalar data[requested_packet_size];
300 
301  const IndexPair<Index> indexPair = this->computeIndexPair(i, j, requested_packet_size - 1);
302  const Index first = indexPair.first;
303  const Index lastIdx = indexPair.second;
304 
305  data[0] = this->m_tensor.coeff(first);
306  for (Index k = 1; k < requested_packet_size - 1; k += 2) {
307  const IndexPair<Index> internal_pair = this->computeIndexPair(i + k, j, 1);
308  data[k] = this->m_tensor.coeff(internal_pair.first);
309  data[k + 1] = this->m_tensor.coeff(internal_pair.second);
310  }
311  data[requested_packet_size - 1] = this->m_tensor.coeff(lastIdx);
312 
313  return pload<PacketT>(data);
314  }
@ size
Definition: GenericPacketMath.h:139

References Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::computeIndexPair(), data, EIGEN_ALIGN_MAX, Eigen::IndexPair< Idx >::first, j, k, Eigen::internal::SimpleTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_ >::m_tensor, and Eigen::IndexPair< Idx >::second.

◆ loadPacket()

template<typename Scalar , typename Index , int side, typename Tensor , typename nocontract_t , typename contract_t , int packet_size, bool inner_dim_contiguous, bool inner_dim_reordered, int Alignment, template< class > class MakePointer_>
template<typename PacketT , int AlignmentType>
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketT Eigen::internal::BaseTensorContractionMapper< Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment, MakePointer_ >::loadPacket ( Index  i,
Index  j 
) const
inline
317  {
318  return this->load<PacketT, AlignmentType>(i, j);
319  }

References i, and j.


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