Eigen::internal::dhs_pack< Scalar, DataMapper, Packet, StorageOrder, PanelMode, UseLhs > Struct Template Reference

#include <MatrixProduct.h>

Public Member Functions

template<Index n>
EIGEN_ALWAYS_INLINE void dhs_copy (Scalar *blockA, const DataMapper &lhs2, Index &i, Index &ri, Index depth, const Index vectorSize)
 
EIGEN_STRONG_INLINE void operator() (Scalar *blockA, const DataMapper &lhs, Index depth, Index rows, Index stride, Index offset)
 

Member Function Documentation

◆ dhs_copy()

template<typename Scalar , typename DataMapper , typename Packet , int StorageOrder, bool PanelMode, bool UseLhs>
template<Index n>
EIGEN_ALWAYS_INLINE void Eigen::internal::dhs_pack< Scalar, DataMapper, Packet, StorageOrder, PanelMode, UseLhs >::dhs_copy ( Scalar blockA,
const DataMapper &  lhs2,
Index i,
Index ri,
Index  depth,
const Index  vectorSize 
)
inline
560  {
561  PacketBlock<Packet, 4> block[n];
562 
563  for (; i + n * vectorSize <= depth; i += n * vectorSize) {
564  for (Index k = 0; k < n; k++) {
565  if (UseLhs) {
566  bload<DataMapper, Packet, 4, StorageOrder, false, 4>(block[k], lhs2, 0, i + k * vectorSize);
567  } else {
568  bload<DataMapper, Packet, 4, StorageOrder, false, 4>(block[k], lhs2, i + k * vectorSize, 0);
569  }
570  }
571 
572  if (((StorageOrder == RowMajor) && UseLhs) || ((StorageOrder == ColMajor) && !UseLhs)) {
573  for (Index k = 0; k < n; k++) {
574  ptranspose(block[k]);
575  }
576  }
577 
578  for (Index k = 0; k < n; k++) {
579  storeBlock<Scalar, Packet, 4>(blockA + ri + k * 4 * vectorSize, block[k]);
580  }
581 
582  ri += n * 4 * vectorSize;
583  }
584  }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
m m block(1, 0, 2, 2)<< 4
@ ColMajor
Definition: Constants.h:318
@ RowMajor
Definition: Constants.h:320
char char char int int * k
Definition: level2_impl.h:374
EIGEN_STRONG_INLINE void ptranspose(PacketBlock< Packet2cf, 2 > &kernel)
Definition: AltiVec/Complex.h:339
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83

References block(), Eigen::ColMajor, i, k, n, Eigen::internal::ptranspose(), and Eigen::RowMajor.

◆ operator()()

template<typename Scalar , typename DataMapper , typename Packet , int StorageOrder, bool PanelMode, bool UseLhs>
EIGEN_STRONG_INLINE void Eigen::internal::dhs_pack< Scalar, DataMapper, Packet, StorageOrder, PanelMode, UseLhs >::operator() ( Scalar blockA,
const DataMapper &  lhs,
Index  depth,
Index  rows,
Index  stride,
Index  offset 
)
inline
587  {
588  const Index vectorSize = quad_traits<Scalar>::vectorsize;
589  Index ri = 0, j = 0;
590 
591  for (; j + vectorSize <= rows; j += vectorSize) {
592  const DataMapper lhs2 = UseLhs ? lhs.getSubMapper(j, 0) : lhs.getSubMapper(0, j);
593  Index i = 0;
594 
595  if (PanelMode) ri += vectorSize * offset;
596 
597  dhs_copy<4>(blockA, lhs2, i, ri, depth, vectorSize);
598  dhs_copy<2>(blockA, lhs2, i, ri, depth, vectorSize);
599  dhs_copy<1>(blockA, lhs2, i, ri, depth, vectorSize);
600 
601  for (; i < depth; i++) {
602  if (((StorageOrder == RowMajor) && UseLhs) || ((StorageOrder == ColMajor) && !UseLhs)) {
603  if (UseLhs) {
604  blockA[ri + 0] = lhs2(0, i);
605  blockA[ri + 1] = lhs2(1, i);
606  blockA[ri + 2] = lhs2(2, i);
607  blockA[ri + 3] = lhs2(3, i);
608  } else {
609  blockA[ri + 0] = lhs2(i, 0);
610  blockA[ri + 1] = lhs2(i, 1);
611  blockA[ri + 2] = lhs2(i, 2);
612  blockA[ri + 3] = lhs2(i, 3);
613  }
614  } else {
615  Packet lhsV;
616  if (UseLhs) {
617  lhsV = lhs2.template loadPacket<Packet>(0, i);
618  } else {
619  lhsV = lhs2.template loadPacket<Packet>(i, 0);
620  }
621  pstore<Scalar>(blockA + ri, lhsV);
622  }
623 
624  ri += vectorSize;
625  }
626 
627  if (PanelMode) ri += vectorSize * (stride - offset - depth);
628  }
629 
630  if (!UseLhs) {
631  if (PanelMode) ri += offset;
632 
633  for (; j < rows; j++) {
634  const DataMapper lhs2 = lhs.getSubMapper(0, j);
635  for (Index i = 0; i < depth; i++) {
636  blockA[ri] = lhs2(i, 0);
637  ri += 1;
638  }
639 
640  if (PanelMode) ri += stride - depth;
641  }
642  } else {
643  if (j < rows) {
644  if (PanelMode) ri += offset * (rows - j);
645 
646  for (Index i = 0; i < depth; i++) {
647  Index k = j;
648  for (; k < rows; k++) {
649  blockA[ri] = lhs(k, i);
650  ri += 1;
651  }
652  }
653  }
654  }
655  }
int rows
Definition: Tutorial_commainit_02.cpp:1
@ vectorsize
Definition: MatrixProduct.h:67
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References Eigen::ColMajor, i, j, k, Eigen::RowMajor, and rows.


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