mapstride.cpp File Reference
#include "main.h"

Functions

template<int Alignment, typename VectorType >
void map_class_vector (const VectorType &m)
 
template<int Alignment, typename MatrixType >
void map_class_matrix (const MatrixType &_m)
 
template<int >
void bug1453 ()
 
 EIGEN_DECLARE_TEST (mapstride)
 

Function Documentation

◆ bug1453()

template<int >
void bug1453 ( )
207  {
208  const int data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
209  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
210  typedef Matrix<int, Dynamic, Dynamic, RowMajor> RowMatrixXi;
211  typedef Matrix<int, 2, 3, ColMajor> ColMatrix23i;
212  typedef Matrix<int, 3, 2, ColMajor> ColMatrix32i;
213  typedef Matrix<int, 2, 3, RowMajor> RowMatrix23i;
214  typedef Matrix<int, 3, 2, RowMajor> RowMatrix32i;
215 
216  VERIFY_IS_APPROX(MatrixXi::Map(data, 2, 3, InnerStride<2>()), MatrixXi::Map(data, 2, 3, Stride<4, 2>()));
217  VERIFY_IS_APPROX(MatrixXi::Map(data, 2, 3, InnerStride<>(2)), MatrixXi::Map(data, 2, 3, Stride<4, 2>()));
218  VERIFY_IS_APPROX(MatrixXi::Map(data, 3, 2, InnerStride<2>()), MatrixXi::Map(data, 3, 2, Stride<6, 2>()));
219  VERIFY_IS_APPROX(MatrixXi::Map(data, 3, 2, InnerStride<>(2)), MatrixXi::Map(data, 3, 2, Stride<6, 2>()));
220 
221  VERIFY_IS_APPROX(RowMatrixXi::Map(data, 2, 3, InnerStride<2>()), RowMatrixXi::Map(data, 2, 3, Stride<6, 2>()));
222  VERIFY_IS_APPROX(RowMatrixXi::Map(data, 2, 3, InnerStride<>(2)), RowMatrixXi::Map(data, 2, 3, Stride<6, 2>()));
223  VERIFY_IS_APPROX(RowMatrixXi::Map(data, 3, 2, InnerStride<2>()), RowMatrixXi::Map(data, 3, 2, Stride<4, 2>()));
224  VERIFY_IS_APPROX(RowMatrixXi::Map(data, 3, 2, InnerStride<>(2)), RowMatrixXi::Map(data, 3, 2, Stride<4, 2>()));
225 
226  VERIFY_IS_APPROX(ColMatrix23i::Map(data, InnerStride<2>()), MatrixXi::Map(data, 2, 3, Stride<4, 2>()));
227  VERIFY_IS_APPROX(ColMatrix23i::Map(data, InnerStride<>(2)), MatrixXi::Map(data, 2, 3, Stride<4, 2>()));
228  VERIFY_IS_APPROX(ColMatrix32i::Map(data, InnerStride<2>()), MatrixXi::Map(data, 3, 2, Stride<6, 2>()));
229  VERIFY_IS_APPROX(ColMatrix32i::Map(data, InnerStride<>(2)), MatrixXi::Map(data, 3, 2, Stride<6, 2>()));
230 
231  VERIFY_IS_APPROX(RowMatrix23i::Map(data, InnerStride<2>()), RowMatrixXi::Map(data, 2, 3, Stride<6, 2>()));
232  VERIFY_IS_APPROX(RowMatrix23i::Map(data, InnerStride<>(2)), RowMatrixXi::Map(data, 2, 3, Stride<6, 2>()));
233  VERIFY_IS_APPROX(RowMatrix32i::Map(data, InnerStride<2>()), RowMatrixXi::Map(data, 3, 2, Stride<4, 2>()));
234  VERIFY_IS_APPROX(RowMatrix32i::Map(data, InnerStride<>(2)), RowMatrixXi::Map(data, 3, 2, Stride<4, 2>()));
235 }
int data[]
Definition: Map_placement_new.cpp:1
Convenience specialization of Stride to specify only an inner stride See class Map for some examples.
Definition: Stride.h:93
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
Holds strides information for Map.
Definition: Stride.h:55
#define VERIFY_IS_APPROX(a, b)
Definition: integer_types.cpp:13

References data, and VERIFY_IS_APPROX.

◆ EIGEN_DECLARE_TEST()

EIGEN_DECLARE_TEST ( mapstride  )
237  {
238  for (int i = 0; i < g_repeat; i++) {
239  int maxn = 3;
240  CALL_SUBTEST_1(map_class_vector<Aligned>(Matrix<float, 1, 1>()));
241  CALL_SUBTEST_1(map_class_vector<Unaligned>(Matrix<float, 1, 1>()));
242  CALL_SUBTEST_2(map_class_vector<Aligned>(Vector4d()));
243  CALL_SUBTEST_2(map_class_vector<Unaligned>(Vector4d()));
244  CALL_SUBTEST_3(map_class_vector<Aligned>(RowVector4f()));
245  CALL_SUBTEST_3(map_class_vector<Unaligned>(RowVector4f()));
246  CALL_SUBTEST_4(map_class_vector<Aligned>(VectorXcf(internal::random<int>(1, maxn))));
247  CALL_SUBTEST_4(map_class_vector<Unaligned>(VectorXcf(internal::random<int>(1, maxn))));
248  CALL_SUBTEST_5(map_class_vector<Aligned>(VectorXi(internal::random<int>(1, maxn))));
249  CALL_SUBTEST_5(map_class_vector<Unaligned>(VectorXi(internal::random<int>(1, maxn))));
250 
251  CALL_SUBTEST_1(map_class_matrix<Aligned>(Matrix<float, 1, 1>()));
252  CALL_SUBTEST_1(map_class_matrix<Unaligned>(Matrix<float, 1, 1>()));
253  CALL_SUBTEST_2(map_class_matrix<Aligned>(Matrix4d()));
254  CALL_SUBTEST_2(map_class_matrix<Unaligned>(Matrix4d()));
255  CALL_SUBTEST_3(map_class_matrix<Aligned>(Matrix<float, 3, 5>()));
256  CALL_SUBTEST_3(map_class_matrix<Unaligned>(Matrix<float, 3, 5>()));
257  CALL_SUBTEST_3(map_class_matrix<Aligned>(Matrix<float, 4, 8>()));
258  CALL_SUBTEST_3(map_class_matrix<Unaligned>(Matrix<float, 4, 8>()));
260  map_class_matrix<Aligned>(MatrixXcf(internal::random<int>(1, maxn), internal::random<int>(1, maxn))));
262  map_class_matrix<Unaligned>(MatrixXcf(internal::random<int>(1, maxn), internal::random<int>(1, maxn))));
263  CALL_SUBTEST_5(map_class_matrix<Aligned>(MatrixXi(internal::random<int>(1, maxn), internal::random<int>(1, maxn))));
265  map_class_matrix<Unaligned>(MatrixXi(internal::random<int>(1, maxn), internal::random<int>(1, maxn))));
267  map_class_matrix<Aligned>(MatrixXcd(internal::random<int>(1, maxn), internal::random<int>(1, maxn))));
269  map_class_matrix<Unaligned>(MatrixXcd(internal::random<int>(1, maxn), internal::random<int>(1, maxn))));
270 
271  CALL_SUBTEST_5(bug1453<0>());
272 
274  }
275 }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
#define TEST_SET_BUT_UNUSED_VARIABLE(X)
Definition: main.h:139
static int g_repeat
Definition: main.h:191
#define CALL_SUBTEST_6(FUNC)
Definition: split_test_helper.h:34
#define CALL_SUBTEST_3(FUNC)
Definition: split_test_helper.h:16
#define CALL_SUBTEST_1(FUNC)
Definition: split_test_helper.h:4
#define CALL_SUBTEST_5(FUNC)
Definition: split_test_helper.h:28
#define CALL_SUBTEST_2(FUNC)
Definition: split_test_helper.h:10
#define CALL_SUBTEST_4(FUNC)
Definition: split_test_helper.h:22

References CALL_SUBTEST_1, CALL_SUBTEST_2, CALL_SUBTEST_3, CALL_SUBTEST_4, CALL_SUBTEST_5, CALL_SUBTEST_6, Eigen::g_repeat, i, and TEST_SET_BUT_UNUSED_VARIABLE.

◆ map_class_matrix()

template<int Alignment, typename MatrixType >
void map_class_matrix ( const MatrixType _m)
51  {
52  typedef typename MatrixType::Scalar Scalar;
53 
54  Index rows = _m.rows(), cols = _m.cols();
55 
56  MatrixType m = MatrixType::Random(rows, cols);
57  Scalar s1 = internal::random<Scalar>();
58 
59  Index arraysize = 4 * (rows + 4) * (cols + 4);
60 
61  Scalar* a_array1 = internal::aligned_new<Scalar>(arraysize + 1);
62  Scalar* array1 = a_array1;
63  if (Alignment != Aligned)
64  array1 = (Scalar*)(std::intptr_t(a_array1) + (internal::packet_traits<Scalar>::AlignedOnScalar
65  ? sizeof(Scalar)
66  : sizeof(typename NumTraits<Scalar>::Real)));
67 
68  Scalar a_array2[256];
69  Scalar* array2 = a_array2;
70  if (Alignment != Aligned) {
71  array2 = (Scalar*)(std::intptr_t(a_array2) + (internal::packet_traits<Scalar>::AlignedOnScalar
72  ? sizeof(Scalar)
73  : sizeof(typename NumTraits<Scalar>::Real)));
74  } else {
75  // In case there is no alignment, default to pointing to the start.
76  constexpr int alignment = (std::max<int>)(EIGEN_MAX_ALIGN_BYTES, 1);
77  array2 = (Scalar*)(((std::uintptr_t(a_array2) + alignment - 1) / alignment) * alignment);
78  }
79  Index maxsize2 = a_array2 - array2 + 256;
80 
81  // test no inner stride and some dynamic outer stride
82  for (int k = 0; k < 2; ++k) {
83  if (k == 1 && (m.innerSize() + 1) * m.outerSize() > maxsize2) break;
84  Scalar* array = (k == 0 ? array1 : array2);
85 
87  map = m;
88  VERIFY(map.outerStride() == map.innerSize() + 1);
89  for (int i = 0; i < m.outerSize(); ++i)
90  for (int j = 0; j < m.innerSize(); ++j) {
91  VERIFY_IS_EQUAL(array[map.outerStride() * i + j], m.coeffByOuterInner(i, j));
92  VERIFY_IS_EQUAL(map.coeffByOuterInner(i, j), m.coeffByOuterInner(i, j));
93  }
94  VERIFY_IS_APPROX(s1 * map, s1 * m);
95  map *= s1;
96  VERIFY_IS_APPROX(map, s1 * m);
97  map.setZero();
99  }
100 
101  // test no inner stride and an outer stride of +4. This is quite important as for fixed-size matrices,
102  // this allows to hit the special case where it's vectorizable.
103  for (int k = 0; k < 2; ++k) {
104  if (k == 1 && (m.innerSize() + 4) * m.outerSize() > maxsize2) break;
105  Scalar* array = (k == 0 ? array1 : array2);
106 
107  enum {
108  InnerSize = MatrixType::InnerSizeAtCompileTime,
109  OuterStrideAtCompileTime = InnerSize == Dynamic ? Dynamic : InnerSize + 4
110  };
113  map = m;
114  VERIFY(map.outerStride() == map.innerSize() + 4);
115  for (int i = 0; i < m.outerSize(); ++i)
116  for (int j = 0; j < m.innerSize(); ++j) {
117  VERIFY_IS_EQUAL(array[map.outerStride() * i + j], m.coeffByOuterInner(i, j));
118  VERIFY_IS_EQUAL(map.coeffByOuterInner(i, j), m.coeffByOuterInner(i, j));
119  }
120  VERIFY_IS_APPROX(s1 * map, s1 * m);
121  map *= s1;
122  VERIFY_IS_APPROX(map, s1 * m);
123  map.setZero();
125  }
126 
127  // test both inner stride and outer stride
128  for (int k = 0; k < 2; ++k) {
129  if (k == 1 && (2 * m.innerSize() + 1) * (m.outerSize() * 2) > maxsize2) break;
130  Scalar* array = (k == 0 ? array1 : array2);
131 
133  Stride<Dynamic, Dynamic>(2 * m.innerSize() + 1, 2));
134  map = m;
135  VERIFY(map.outerStride() == 2 * map.innerSize() + 1);
136  VERIFY(map.innerStride() == 2);
137  for (int i = 0; i < m.outerSize(); ++i)
138  for (int j = 0; j < m.innerSize(); ++j) {
139  VERIFY_IS_EQUAL(array[map.outerStride() * i + map.innerStride() * j], m.coeffByOuterInner(i, j));
140  VERIFY_IS_EQUAL(map.coeffByOuterInner(i, j), m.coeffByOuterInner(i, j));
141  }
142  VERIFY_IS_APPROX(s1 * map, s1 * m);
143  map *= s1;
144  VERIFY_IS_APPROX(map, s1 * m);
145  map.setZero();
147  }
148 
149  // test inner stride and no outer stride
150  for (int k = 0; k < 2; ++k) {
151  if (k == 1 && (m.innerSize() * 2) * m.outerSize() > maxsize2) break;
152  Scalar* array = (k == 0 ? array1 : array2);
153 
155  map = m;
156  VERIFY(map.outerStride() == map.innerSize() * 2);
157  for (int i = 0; i < m.outerSize(); ++i)
158  for (int j = 0; j < m.innerSize(); ++j) {
159  VERIFY_IS_EQUAL(array[map.innerSize() * i * 2 + j * 2], m.coeffByOuterInner(i, j));
160  VERIFY_IS_EQUAL(map.coeffByOuterInner(i, j), m.coeffByOuterInner(i, j));
161  }
162  VERIFY_IS_APPROX(s1 * map, s1 * m);
163  map *= s1;
164  VERIFY_IS_APPROX(map, s1 * m);
165  map.setZero();
167  }
168 
169  // test negative strides
170  {
171  Matrix<Scalar, Dynamic, 1>::Map(a_array1, arraysize + 1).setRandom();
172  Index outerstride = m.innerSize() + 4;
173  Scalar* array = array1;
174 
175  {
177  Map<MatrixType, Unaligned, OuterStride<> > map2(array + (m.outerSize() - 1) * outerstride, rows, cols,
178  OuterStride<>(-outerstride));
179  if (MatrixType::IsRowMajor)
180  VERIFY_IS_APPROX(map1.colwise().reverse(), map2);
181  else
182  VERIFY_IS_APPROX(map1.rowwise().reverse(), map2);
183  }
184 
185  {
188  array + (m.outerSize() - 1) * outerstride + m.innerSize() - 1, rows, cols,
189  Stride<Dynamic, Dynamic>(-outerstride, -1));
190  VERIFY_IS_APPROX(map1.reverse(), map2);
191  }
192 
193  {
195  Map<MatrixType, Unaligned, Stride<Dynamic, -1> > map2(
196  array + (m.outerSize() - 1) * outerstride + m.innerSize() - 1, rows, cols,
197  Stride<Dynamic, -1>(-outerstride, -1));
198  VERIFY_IS_APPROX(map1.reverse(), map2);
199  }
200  }
201 
202  internal::aligned_delete(a_array1, arraysize + 1);
203 }
#define EIGEN_MAX_ALIGN_BYTES
Definition: ConfigureVectorization.h:163
int rows
Definition: Tutorial_commainit_02.cpp:1
int cols
Definition: Tutorial_commainit_02.cpp:1
SCALAR Scalar
Definition: bench_gemm.cpp:45
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
A matrix or vector expression mapping an existing array of data.
Definition: Map.h:96
Convenience specialization of Stride to specify only an outer stride See class Map for some examples.
Definition: Stride.h:104
Derived & setRandom(Index size)
Definition: Random.h:147
@ Unaligned
Definition: Constants.h:235
@ Aligned
Definition: Constants.h:242
int * m
Definition: level2_cplx_impl.h:294
char char char int int * k
Definition: level2_impl.h:374
#define VERIFY_IS_CWISE_EQUAL(a, b)
Definition: main.h:375
#define VERIFY(a)
Definition: main.h:362
#define VERIFY_IS_EQUAL(a, b)
Definition: main.h:367
EIGEN_DEVICE_FUNC void aligned_delete(T *ptr, std::size_t size)
Definition: Memory.h:430
std::array< T, N > array
Definition: EmulateArray.h:231
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
const int Dynamic
Definition: Constants.h:25
double Zero
Definition: pseudosolid_node_update_elements.cc:35
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References Eigen::Aligned, Eigen::internal::aligned_delete(), cols, Eigen::Dynamic, EIGEN_MAX_ALIGN_BYTES, i, Eigen::Map< PlainObjectType, MapOptions, StrideType >::innerStride(), j, k, m, Eigen::Map< PlainObjectType, MapOptions, StrideType >::outerStride(), rows, Eigen::PlainObjectBase< Derived >::setRandom(), Eigen::Unaligned, VERIFY, VERIFY_IS_APPROX, VERIFY_IS_CWISE_EQUAL, VERIFY_IS_EQUAL, and oomph::PseudoSolidHelper::Zero.

◆ map_class_vector()

template<int Alignment, typename VectorType >
void map_class_vector ( const VectorType m)
13  {
14  typedef typename VectorType::Scalar Scalar;
15 
16  Index size = m.size();
17 
18  VectorType v = VectorType::Random(size);
19 
20  Index arraysize = 3 * size;
21 
22  Scalar* a_array = internal::aligned_new<Scalar>(arraysize + 1);
23  Scalar* array = a_array;
24  if (Alignment != Aligned)
25  array = (Scalar*)(std::intptr_t(a_array) + (internal::packet_traits<Scalar>::AlignedOnScalar
26  ? sizeof(Scalar)
27  : sizeof(typename NumTraits<Scalar>::Real)));
28 
29  {
31  map = v;
32  for (int i = 0; i < size; ++i) {
33  VERIFY_IS_EQUAL(array[3 * i], v[i]);
34  VERIFY_IS_EQUAL(map[i], v[i]);
35  }
36  }
37 
38  {
40  map = v;
41  for (int i = 0; i < size; ++i) {
42  VERIFY_IS_EQUAL(array[2 * i], v[i]);
43  VERIFY_IS_EQUAL(map[i], v[i]);
44  }
45  }
46 
47  internal::aligned_delete(a_array, arraysize + 1);
48 }
Array< int, Dynamic, 1 > v
Definition: Array_initializer_list_vector_cxx11.cpp:1
Scalar Scalar int size
Definition: benchVecAdd.cpp:17
Definition: fft_test_shared.h:66

References Eigen::Aligned, Eigen::internal::aligned_delete(), i, m, size, v, and VERIFY_IS_EQUAL.