Lines 2-17
Link Here
|
2 |
// for linear algebra. |
2 |
// for linear algebra. |
3 |
// |
3 |
// |
4 |
// Copyright (C) 2015 Gael Guennebaud <gael.guennebaud@inria.fr> |
4 |
// Copyright (C) 2015 Gael Guennebaud <gael.guennebaud@inria.fr> |
5 |
// |
5 |
// |
6 |
// This Source Code Form is subject to the terms of the Mozilla |
6 |
// This Source Code Form is subject to the terms of the Mozilla |
7 |
// Public License v. 2.0. If a copy of the MPL was not distributed |
7 |
// Public License v. 2.0. If a copy of the MPL was not distributed |
8 |
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. |
8 |
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. |
9 |
|
9 |
|
|
|
10 |
#ifdef EIGEN_TEST_PART_1 |
11 |
#define EIGEN_UNALIGNED_VECTORIZE 1 |
12 |
#endif |
13 |
|
14 |
#ifdef EIGEN_TEST_PART_2 |
15 |
#define EIGEN_UNALIGNED_VECTORIZE 0 |
16 |
#endif |
17 |
|
10 |
#ifdef EIGEN_DEFAULT_TO_ROW_MAJOR |
18 |
#ifdef EIGEN_DEFAULT_TO_ROW_MAJOR |
11 |
#undef EIGEN_DEFAULT_TO_ROW_MAJOR |
19 |
#undef EIGEN_DEFAULT_TO_ROW_MAJOR |
12 |
#endif |
20 |
#endif |
13 |
#define EIGEN_DEBUG_ASSIGN |
21 |
#define EIGEN_DEBUG_ASSIGN |
14 |
#include "main.h" |
22 |
#include "main.h" |
15 |
#include <typeinfo> |
23 |
#include <typeinfo> |
16 |
|
24 |
|
17 |
using internal::demangle_flags; |
25 |
using internal::demangle_flags; |
Lines 139-158
struct vectorization_logic
Link Here
|
139 |
InnerVectorizedTraversal,CompleteUnrolling)); |
147 |
InnerVectorizedTraversal,CompleteUnrolling)); |
140 |
VERIFY(test_assign(Vector1(),Vector1().cwiseProduct(Vector1()), |
148 |
VERIFY(test_assign(Vector1(),Vector1().cwiseProduct(Vector1()), |
141 |
InnerVectorizedTraversal,CompleteUnrolling)); |
149 |
InnerVectorizedTraversal,CompleteUnrolling)); |
142 |
|
150 |
|
143 |
VERIFY(test_assign(Matrix44(),Matrix44()+Matrix44(), |
151 |
VERIFY(test_assign(Matrix44(),Matrix44()+Matrix44(), |
144 |
InnerVectorizedTraversal,InnerUnrolling)); |
152 |
InnerVectorizedTraversal,InnerUnrolling)); |
145 |
|
153 |
|
146 |
VERIFY(test_assign(Matrix44u(),Matrix44()+Matrix44(), |
154 |
VERIFY(test_assign(Matrix44u(),Matrix44()+Matrix44(), |
147 |
LinearTraversal,NoUnrolling)); |
155 |
EIGEN_UNALIGNED_VECTORIZE ? InnerVectorizedTraversal : LinearTraversal, |
|
|
156 |
EIGEN_UNALIGNED_VECTORIZE ? InnerUnrolling : NoUnrolling)); |
157 |
|
158 |
VERIFY(test_assign(Matrix1(),Matrix1()+Matrix1(), |
159 |
(Matrix1::InnerSizeAtCompileTime % PacketSize)==0 ? InnerVectorizedTraversal : LinearVectorizedTraversal, |
160 |
CompleteUnrolling)); |
148 |
|
161 |
|
149 |
VERIFY(test_assign(Matrix1u(),Matrix1()+Matrix1(), |
162 |
VERIFY(test_assign(Matrix1u(),Matrix1()+Matrix1(), |
150 |
LinearTraversal,CompleteUnrolling)); |
163 |
EIGEN_UNALIGNED_VECTORIZE ? ((Matrix1::InnerSizeAtCompileTime % PacketSize)==0 ? InnerVectorizedTraversal : LinearVectorizedTraversal) : LinearTraversal, CompleteUnrolling)); |
151 |
|
164 |
|
152 |
VERIFY(test_assign(Matrix44c().col(1),Matrix44c().col(2)+Matrix44c().col(3), |
165 |
VERIFY(test_assign(Matrix44c().col(1),Matrix44c().col(2)+Matrix44c().col(3), |
153 |
InnerVectorizedTraversal,CompleteUnrolling)); |
166 |
InnerVectorizedTraversal,CompleteUnrolling)); |
154 |
|
167 |
|
155 |
VERIFY(test_assign(Matrix44r().row(2),Matrix44r().row(1)+Matrix44r().row(1), |
168 |
VERIFY(test_assign(Matrix44r().row(2),Matrix44r().row(1)+Matrix44r().row(1), |
156 |
InnerVectorizedTraversal,CompleteUnrolling)); |
169 |
InnerVectorizedTraversal,CompleteUnrolling)); |
157 |
|
170 |
|
158 |
if(PacketSize>1) |
171 |
if(PacketSize>1) |
Lines 162-181
struct vectorization_logic
Link Here
|
162 |
LinearTraversal,CompleteUnrolling)); |
175 |
LinearTraversal,CompleteUnrolling)); |
163 |
VERIFY(test_assign(Matrix33c().col(0),Matrix33c().col(1)+Matrix33c().col(1), |
176 |
VERIFY(test_assign(Matrix33c().col(0),Matrix33c().col(1)+Matrix33c().col(1), |
164 |
LinearTraversal,CompleteUnrolling)); |
177 |
LinearTraversal,CompleteUnrolling)); |
165 |
|
178 |
|
166 |
VERIFY(test_assign(Matrix3(),Matrix3().cwiseProduct(Matrix3()), |
179 |
VERIFY(test_assign(Matrix3(),Matrix3().cwiseProduct(Matrix3()), |
167 |
LinearVectorizedTraversal,CompleteUnrolling)); |
180 |
LinearVectorizedTraversal,CompleteUnrolling)); |
168 |
|
181 |
|
169 |
VERIFY(test_assign(Matrix<Scalar,17,17>(),Matrix<Scalar,17,17>()+Matrix<Scalar,17,17>(), |
182 |
VERIFY(test_assign(Matrix<Scalar,17,17>(),Matrix<Scalar,17,17>()+Matrix<Scalar,17,17>(), |
170 |
HalfPacketSize==1 ? InnerVectorizedTraversal : LinearTraversal,NoUnrolling)); |
183 |
HalfPacketSize==1 ? InnerVectorizedTraversal : |
|
|
184 |
EIGEN_UNALIGNED_VECTORIZE ? LinearVectorizedTraversal : |
185 |
LinearTraversal, |
186 |
NoUnrolling)); |
187 |
|
188 |
VERIFY(test_assign(Matrix11(), Matrix11()+Matrix11(),InnerVectorizedTraversal,CompleteUnrolling)); |
189 |
|
171 |
|
190 |
|
172 |
VERIFY(test_assign(Matrix11(),Matrix<Scalar,17,17>().template block<PacketSize,PacketSize>(2,3)+Matrix<Scalar,17,17>().template block<PacketSize,PacketSize>(8,4), |
191 |
VERIFY(test_assign(Matrix11(),Matrix<Scalar,17,17>().template block<PacketSize,PacketSize>(2,3)+Matrix<Scalar,17,17>().template block<PacketSize,PacketSize>(8,4), |
173 |
DefaultTraversal,PacketSize>4?InnerUnrolling:CompleteUnrolling)); |
192 |
(EIGEN_UNALIGNED_VECTORIZE) ? InnerVectorizedTraversal : DefaultTraversal, |
|
|
193 |
(EIGEN_UNALIGNED_VECTORIZE || PacketSize<=4) ? CompleteUnrolling : InnerUnrolling )); |
174 |
|
194 |
|
175 |
VERIFY(test_assign(Vector1(),Matrix11()*Vector1(), |
195 |
VERIFY(test_assign(Vector1(),Matrix11()*Vector1(), |
176 |
InnerVectorizedTraversal,CompleteUnrolling)); |
196 |
InnerVectorizedTraversal,CompleteUnrolling)); |
177 |
|
197 |
|
178 |
VERIFY(test_assign(Matrix11(),Matrix11().lazyProduct(Matrix11()), |
198 |
VERIFY(test_assign(Matrix11(),Matrix11().lazyProduct(Matrix11()), |
179 |
InnerVectorizedTraversal,InnerUnrolling+CompleteUnrolling)); |
199 |
InnerVectorizedTraversal,InnerUnrolling+CompleteUnrolling)); |
180 |
} |
200 |
} |
181 |
|
201 |
|
Lines 282-315
struct vectorization_logic_half
Link Here
|
282 |
InnerVectorizedTraversal,CompleteUnrolling)); |
302 |
InnerVectorizedTraversal,CompleteUnrolling)); |
283 |
VERIFY(test_assign(Vector1(),Vector1().cwiseProduct(Vector1()), |
303 |
VERIFY(test_assign(Vector1(),Vector1().cwiseProduct(Vector1()), |
284 |
InnerVectorizedTraversal,CompleteUnrolling)); |
304 |
InnerVectorizedTraversal,CompleteUnrolling)); |
285 |
|
305 |
|
286 |
VERIFY(test_assign(Matrix57(),Matrix57()+Matrix57(), |
306 |
VERIFY(test_assign(Matrix57(),Matrix57()+Matrix57(), |
287 |
InnerVectorizedTraversal,InnerUnrolling)); |
307 |
InnerVectorizedTraversal,InnerUnrolling)); |
288 |
|
308 |
|
289 |
VERIFY(test_assign(Matrix57u(),Matrix57()+Matrix57(), |
309 |
VERIFY(test_assign(Matrix57u(),Matrix57()+Matrix57(), |
290 |
LinearTraversal,NoUnrolling)); |
310 |
EIGEN_UNALIGNED_VECTORIZE ? InnerVectorizedTraversal : LinearTraversal, |
|
|
311 |
EIGEN_UNALIGNED_VECTORIZE ? InnerUnrolling : NoUnrolling)); |
291 |
|
312 |
|
292 |
VERIFY(test_assign(Matrix1u(),Matrix1()+Matrix1(), |
313 |
VERIFY(test_assign(Matrix1u(),Matrix1()+Matrix1(), |
293 |
LinearTraversal,CompleteUnrolling)); |
314 |
EIGEN_UNALIGNED_VECTORIZE ? ((Matrix1::InnerSizeAtCompileTime % PacketSize)==0 ? InnerVectorizedTraversal : LinearVectorizedTraversal) : LinearTraversal,CompleteUnrolling)); |
294 |
|
315 |
|
295 |
if(PacketSize>1) |
316 |
if(PacketSize>1) |
296 |
{ |
317 |
{ |
297 |
typedef Matrix<Scalar,3,3,ColMajor> Matrix33c; |
318 |
typedef Matrix<Scalar,3,3,ColMajor> Matrix33c; |
298 |
VERIFY(test_assign(Matrix33c().row(2),Matrix33c().row(1)+Matrix33c().row(1), |
319 |
VERIFY(test_assign(Matrix33c().row(2),Matrix33c().row(1)+Matrix33c().row(1), |
299 |
LinearTraversal,CompleteUnrolling)); |
320 |
LinearTraversal,CompleteUnrolling)); |
300 |
VERIFY(test_assign(Matrix33c().col(0),Matrix33c().col(1)+Matrix33c().col(1), |
321 |
VERIFY(test_assign(Matrix33c().col(0),Matrix33c().col(1)+Matrix33c().col(1), |
301 |
LinearTraversal,CompleteUnrolling)); |
322 |
LinearTraversal,CompleteUnrolling)); |
302 |
|
323 |
|
303 |
VERIFY(test_assign(Matrix3(),Matrix3().cwiseQuotient(Matrix3()), |
324 |
VERIFY(test_assign(Matrix3(),Matrix3().cwiseQuotient(Matrix3()), |
304 |
PacketTraits::HasDiv ? LinearVectorizedTraversal : LinearTraversal,CompleteUnrolling)); |
325 |
PacketTraits::HasDiv ? LinearVectorizedTraversal : LinearTraversal,CompleteUnrolling)); |
305 |
|
326 |
|
306 |
VERIFY(test_assign(Matrix<Scalar,17,17>(),Matrix<Scalar,17,17>()+Matrix<Scalar,17,17>(), |
327 |
VERIFY(test_assign(Matrix<Scalar,17,17>(),Matrix<Scalar,17,17>()+Matrix<Scalar,17,17>(), |
307 |
LinearTraversal,NoUnrolling)); |
328 |
EIGEN_UNALIGNED_VECTORIZE ? (PacketSize==1 ? InnerVectorizedTraversal : LinearVectorizedTraversal) : LinearTraversal, |
|
|
329 |
NoUnrolling)); |
308 |
|
330 |
|
309 |
VERIFY(test_assign(Matrix11(),Matrix<Scalar,17,17>().template block<PacketSize,PacketSize>(2,3)+Matrix<Scalar,17,17>().template block<PacketSize,PacketSize>(8,4), |
331 |
VERIFY(test_assign(Matrix11(),Matrix<Scalar,17,17>().template block<PacketSize,PacketSize>(2,3)+Matrix<Scalar,17,17>().template block<PacketSize,PacketSize>(8,4), |
310 |
DefaultTraversal,PacketSize>4?InnerUnrolling:CompleteUnrolling)); |
332 |
DefaultTraversal,PacketSize>4?InnerUnrolling:CompleteUnrolling)); |
311 |
|
333 |
|
312 |
VERIFY(test_assign(Vector1(),Matrix11()*Vector1(), |
334 |
VERIFY(test_assign(Vector1(),Matrix11()*Vector1(), |
313 |
InnerVectorizedTraversal,CompleteUnrolling)); |
335 |
InnerVectorizedTraversal,CompleteUnrolling)); |
314 |
|
336 |
|
315 |
VERIFY(test_assign(Matrix11(),Matrix11().lazyProduct(Matrix11()), |
337 |
VERIFY(test_assign(Matrix11(),Matrix11().lazyProduct(Matrix11()), |
Lines 362-386
void test_vectorization_logic()
Link Here
|
362 |
CALL_SUBTEST( vectorization_logic_half<float>::run() ); |
384 |
CALL_SUBTEST( vectorization_logic_half<float>::run() ); |
363 |
CALL_SUBTEST( vectorization_logic_half<double>::run() ); |
385 |
CALL_SUBTEST( vectorization_logic_half<double>::run() ); |
364 |
CALL_SUBTEST( vectorization_logic_half<std::complex<float> >::run() ); |
386 |
CALL_SUBTEST( vectorization_logic_half<std::complex<float> >::run() ); |
365 |
CALL_SUBTEST( vectorization_logic_half<std::complex<double> >::run() ); |
387 |
CALL_SUBTEST( vectorization_logic_half<std::complex<double> >::run() ); |
366 |
|
388 |
|
367 |
if(internal::packet_traits<float>::Vectorizable) |
389 |
if(internal::packet_traits<float>::Vectorizable) |
368 |
{ |
390 |
{ |
369 |
VERIFY(test_assign(Matrix<float,3,3>(),Matrix<float,3,3>()+Matrix<float,3,3>(), |
391 |
VERIFY(test_assign(Matrix<float,3,3>(),Matrix<float,3,3>()+Matrix<float,3,3>(), |
370 |
LinearTraversal,CompleteUnrolling)); |
392 |
EIGEN_UNALIGNED_VECTORIZE ? LinearVectorizedTraversal : LinearTraversal,CompleteUnrolling)); |
371 |
|
393 |
|
372 |
VERIFY(test_redux(Matrix<float,5,2>(), |
394 |
VERIFY(test_redux(Matrix<float,5,2>(), |
373 |
DefaultTraversal,CompleteUnrolling)); |
395 |
EIGEN_UNALIGNED_VECTORIZE ? LinearVectorizedTraversal : DefaultTraversal,CompleteUnrolling)); |
374 |
} |
396 |
} |
375 |
|
397 |
|
376 |
if(internal::packet_traits<double>::Vectorizable) |
398 |
if(internal::packet_traits<double>::Vectorizable) |
377 |
{ |
399 |
{ |
378 |
VERIFY(test_assign(Matrix<double,3,3>(),Matrix<double,3,3>()+Matrix<double,3,3>(), |
400 |
VERIFY(test_assign(Matrix<double,3,3>(),Matrix<double,3,3>()+Matrix<double,3,3>(), |
379 |
LinearTraversal,CompleteUnrolling)); |
401 |
EIGEN_UNALIGNED_VECTORIZE ? LinearVectorizedTraversal : LinearTraversal,CompleteUnrolling)); |
380 |
|
402 |
|
381 |
VERIFY(test_redux(Matrix<double,7,3>(), |
403 |
VERIFY(test_redux(Matrix<double,7,3>(), |
382 |
DefaultTraversal,CompleteUnrolling)); |
404 |
EIGEN_UNALIGNED_VECTORIZE ? LinearVectorizedTraversal : DefaultTraversal,CompleteUnrolling)); |
383 |
} |
405 |
} |
384 |
#endif // EIGEN_VECTORIZE |
406 |
#endif // EIGEN_VECTORIZE |
385 |
|
407 |
|
386 |
} |
408 |
} |