vectorization_logic< Scalar, Enable > Struct Template Reference

Public Types

enum  { PacketSize = internal::unpacket_traits<PacketType>::size , HalfPacketSize = internal::unpacket_traits<HalfPacketType>::size }
 
typedef internal::packet_traits< ScalarPacketTraits
 
typedef internal::packet_traits< Scalar >::type PacketType
 
typedef internal::unpacket_traits< PacketType >::half HalfPacketType
 

Static Public Member Functions

static void run ()
 

Member Typedef Documentation

◆ HalfPacketType

template<typename Scalar , bool Enable = internal::packet_traits<Scalar>::Vectorizable>
typedef internal::unpacket_traits<PacketType>::half vectorization_logic< Scalar, Enable >::HalfPacketType

◆ PacketTraits

template<typename Scalar , bool Enable = internal::packet_traits<Scalar>::Vectorizable>
typedef internal::packet_traits<Scalar> vectorization_logic< Scalar, Enable >::PacketTraits

◆ PacketType

template<typename Scalar , bool Enable = internal::packet_traits<Scalar>::Vectorizable>
typedef internal::packet_traits<Scalar>::type vectorization_logic< Scalar, Enable >::PacketType

Member Enumeration Documentation

◆ anonymous enum

template<typename Scalar , bool Enable = internal::packet_traits<Scalar>::Vectorizable>
anonymous enum
Enumerator
PacketSize 
HalfPacketSize 
112  {
115  };
Scalar Scalar int size
Definition: benchVecAdd.cpp:17
@ HalfPacketSize
Definition: vectorization_logic.cpp:114
@ PacketSize
Definition: vectorization_logic.cpp:113

Member Function Documentation

◆ run()

template<typename Scalar , bool Enable = internal::packet_traits<Scalar>::Vectorizable>
static void vectorization_logic< Scalar, Enable >::run ( )
inlinestatic
116  {
117  typedef Matrix<Scalar, PacketSize, 1> Vector1;
119  typedef Matrix<Scalar, Dynamic, Dynamic> MatrixXX;
121  typedef Matrix<Scalar, (Matrix11::Flags & RowMajorBit) ? 8 : 2 * PacketSize,
122  (Matrix11::Flags & RowMajorBit) ? 2 * PacketSize : 8>
123  Matrix22;
124  typedef Matrix<Scalar, (Matrix11::Flags & RowMajorBit) ? 16 : 4 * PacketSize,
125  (Matrix11::Flags & RowMajorBit) ? 4 * PacketSize : 16>
126  Matrix44;
127  typedef Matrix<Scalar, (Matrix11::Flags & RowMajorBit) ? 16 : 4 * PacketSize,
128  (Matrix11::Flags & RowMajorBit) ? 4 * PacketSize : 16,
130  Matrix44u;
133 
134  typedef Matrix<Scalar,
135  (PacketSize == 16 ? 8
136  : PacketSize == 8 ? 4
137  : PacketSize == 4 ? 2
138  : PacketSize == 2 ? 1
139  : /*PacketSize==1 ?*/ 1),
140  (PacketSize == 16 ? 2
141  : PacketSize == 8 ? 2
142  : PacketSize == 4 ? 2
143  : PacketSize == 2 ? 2
144  : /*PacketSize==1 ?*/ 1)>
145  Matrix1;
146 
147  typedef Matrix<Scalar,
148  (PacketSize == 16 ? 8
149  : PacketSize == 8 ? 4
150  : PacketSize == 4 ? 2
151  : PacketSize == 2 ? 1
152  : /*PacketSize==1 ?*/ 1),
153  (PacketSize == 16 ? 2
154  : PacketSize == 8 ? 2
155  : PacketSize == 4 ? 2
156  : PacketSize == 2 ? 2
157  : /*PacketSize==1 ?*/ 1),
158  DontAlign | ((Matrix1::Flags & RowMajorBit) ? RowMajor : ColMajor)>
159  Matrix1u;
160 
161  // this type is made such that it can only be vectorized when viewed as a linear 1D vector
162  typedef Matrix<Scalar,
163  (PacketSize == 16 ? 4
164  : PacketSize == 8 ? 4
165  : PacketSize == 4 ? 6
166  : PacketSize == 2 ? ((Matrix11::Flags & RowMajorBit) ? 2 : 3)
167  : /*PacketSize==1 ?*/ 1),
168  (PacketSize == 16 ? 12
169  : PacketSize == 8 ? 6
170  : PacketSize == 4 ? 2
171  : PacketSize == 2 ? ((Matrix11::Flags & RowMajorBit) ? 3 : 2)
172  : /*PacketSize==1 ?*/ 3)>
173  Matrix3;
174 
175 #if !EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT
177  VERIFY(test_assign(Vector1(), Vector1() + Vector1(), InnerVectorizedTraversal, CompleteUnrolling));
178  VERIFY(test_assign(Vector1(), Vector1().cwiseProduct(Vector1()), InnerVectorizedTraversal, CompleteUnrolling));
179  VERIFY(test_assign(Vector1(), Vector1().template cast<Scalar>(), InnerVectorizedTraversal, CompleteUnrolling));
180 
181  VERIFY(test_assign(Matrix44(), Matrix44() + Matrix44(), InnerVectorizedTraversal, InnerUnrolling));
182 
183  VERIFY(test_assign(Matrix44u(), Matrix44() + Matrix44(),
186 
187  VERIFY(test_assign(Matrix1(), Matrix1() + Matrix1(),
188  (int(Matrix1::InnerSizeAtCompileTime) % int(PacketSize)) == 0 ? InnerVectorizedTraversal
191 
192  VERIFY(test_assign(Matrix1u(), Matrix1() + Matrix1(),
194  ? ((int(Matrix1::InnerSizeAtCompileTime) % int(PacketSize)) == 0 ? InnerVectorizedTraversal
196  : LinearTraversal,
198 
199  VERIFY(test_assign(Matrix44c().col(1), Matrix44c().col(2) + Matrix44c().col(3), InnerVectorizedTraversal,
201 
202  VERIFY(test_assign(Matrix44r().row(2), Matrix44r().row(1) + Matrix44r().row(1), InnerVectorizedTraversal,
204 
205  if (PacketSize > 1) {
206  typedef Matrix<Scalar, 3, 3, ColMajor> Matrix33c;
207  typedef Matrix<Scalar, 3, 1, ColMajor> Vector3;
208  VERIFY(
209  test_assign(Matrix33c().row(2), Matrix33c().row(1) + Matrix33c().row(1), LinearTraversal, CompleteUnrolling));
210  // Vectorization depends on too many factors - ignore.
211  VERIFY(test_assign(Vector3(), Vector3() + Vector3(), -1, CompleteUnrolling));
212 
213  VERIFY(test_assign(Matrix3(), Matrix3().cwiseProduct(Matrix3()), LinearVectorizedTraversal, CompleteUnrolling));
214 
215  // Vectorization depends on too many factors - ignore.
216  VERIFY(
218 
219  VERIFY(test_assign(Matrix11(), Matrix11() + Matrix11(), InnerVectorizedTraversal, CompleteUnrolling));
220 
221  VERIFY(test_assign(Matrix11(),
222  Matrix<Scalar, 21, 21>().template block<PacketSize, PacketSize>(2, 3) +
223  Matrix<Scalar, 21, 21>().template block<PacketSize, PacketSize>(3, 2),
226 
227  VERIFY(test_assign(Vector1(), Matrix11() * Vector1(), InnerVectorizedTraversal, CompleteUnrolling));
228 
229  VERIFY(test_assign(Matrix11(), Matrix11().lazyProduct(Matrix11()), InnerVectorizedTraversal,
231  }
232 
234 
236 
237  VERIFY(test_redux((Vector1().array() * Vector1().array()).col(0), LinearVectorizedTraversal, CompleteUnrolling));
238 
240 
242 
244 
245  if (PacketSize > 1) {
246  VERIFY(test_redux(Matrix44().template block < (Matrix1::Flags & RowMajorBit) ? 4 : PacketSize,
247  (Matrix1::Flags & RowMajorBit) ? PacketSize : 4 > (1, 2), SliceVectorizedTraversal,
249 
250  VERIFY(test_redux(Matrix44().template block < (Matrix1::Flags & RowMajorBit) ? 2 : PacketSize,
251  (Matrix1::Flags & RowMajorBit) ? PacketSize : 2 > (1, 2), DefaultTraversal, CompleteUnrolling));
252  }
253 
254  VERIFY(
255  test_redux(Matrix44c().template block<2 * PacketSize, 1>(1, 2), LinearVectorizedTraversal, CompleteUnrolling));
256 
257  VERIFY(
258  test_redux(Matrix44r().template block<1, 2 * PacketSize>(2, 1), LinearVectorizedTraversal, CompleteUnrolling));
259 
262 
268 
269  VERIFY((test_assign(Matrix11(),
273 #endif
274 
275  VERIFY(test_assign(MatrixXX(10, 10), MatrixXX(20, 20).block(10, 10, 2, 3), SliceVectorizedTraversal, NoUnrolling));
276 
278  }
#define EIGEN_UNALIGNED_VECTORIZE
Definition: ConfigureVectorization.h:173
#define EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION
Definition: Macros.h:31
m col(1)
m row(1)
m m block(1, 0, 2, 2)<< 4
SCALAR Scalar
Definition: bench_gemm.cpp:45
Convenience specialization of Stride to specify only an inner stride See class Map for some examples.
Definition: Stride.h:93
A matrix or vector expression mapping an existing array of data.
Definition: Map.h:96
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
Convenience specialization of Stride to specify only an outer stride See class Map for some examples.
Definition: Stride.h:104
@ InnerVectorizedTraversal
Definition: Constants.h:284
@ LinearVectorizedTraversal
Definition: Constants.h:287
@ DefaultTraversal
Definition: Constants.h:279
@ SliceVectorizedTraversal
Definition: Constants.h:290
@ LinearTraversal
Definition: Constants.h:281
@ AlignedMax
Definition: Constants.h:254
@ ColMajor
Definition: Constants.h:318
@ DontAlign
Definition: Constants.h:324
@ RowMajor
Definition: Constants.h:320
@ InnerUnrolling
Definition: Constants.h:303
@ CompleteUnrolling
Definition: Constants.h:306
@ NoUnrolling
Definition: Constants.h:301
const unsigned int RowMajorBit
Definition: Constants.h:70
#define VERIFY(a)
Definition: main.h:362
constexpr int plain_enum_min(A a, B b)
Definition: Meta.h:649
constexpr int plain_enum_max(A a, B b)
Definition: Meta.h:656
std::array< T, N > array
Definition: EmulateArray.h:231
Matrix< Scalar, Dynamic, 1 > VectorX
Definition: sparse_lu.cpp:43
bool test_redux(const Xpr &, int traversal, int unrolling)
Definition: vectorization_logic.cpp:88
bool test_assign(const Dst &, const Src &, int traversal, int unrolling)
Definition: vectorization_logic.cpp:38

References Eigen::AlignedMax, block(), col(), Eigen::ColMajor, Eigen::CompleteUnrolling, Eigen::DefaultTraversal, Eigen::DontAlign, EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION, EIGEN_UNALIGNED_VECTORIZE, Eigen::InnerUnrolling, Eigen::InnerVectorizedTraversal, Eigen::LinearTraversal, Eigen::LinearVectorizedTraversal, Eigen::NoUnrolling, vectorization_logic< Scalar, Enable >::PacketSize, Eigen::internal::plain_enum_max(), Eigen::internal::plain_enum_min(), row(), Eigen::RowMajor, Eigen::RowMajorBit, Eigen::SliceVectorizedTraversal, test_assign(), test_redux(), and VERIFY.


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