[136] | 1 | #include <iostream>
|
---|
| 2 | #include <iomanip>
|
---|
| 3 | #include <Eigen/Core>
|
---|
| 4 | #include <Eigen/Geometry>
|
---|
| 5 | #include <bench/BenchTimer.h>
|
---|
| 6 |
|
---|
| 7 | using namespace Eigen;
|
---|
| 8 | using namespace std;
|
---|
| 9 |
|
---|
| 10 | #ifndef REPEAT
|
---|
| 11 | #define REPEAT 1000000
|
---|
| 12 | #endif
|
---|
| 13 |
|
---|
| 14 | enum func_opt
|
---|
| 15 | {
|
---|
| 16 | TV,
|
---|
| 17 | TMATV,
|
---|
| 18 | TMATVMAT,
|
---|
| 19 | };
|
---|
| 20 |
|
---|
| 21 |
|
---|
| 22 | template <class res, class arg1, class arg2, int opt>
|
---|
| 23 | struct func;
|
---|
| 24 |
|
---|
| 25 | template <class res, class arg1, class arg2>
|
---|
| 26 | struct func<res, arg1, arg2, TV>
|
---|
| 27 | {
|
---|
| 28 | static EIGEN_DONT_INLINE res run( arg1& a1, arg2& a2 )
|
---|
| 29 | {
|
---|
| 30 | asm ("");
|
---|
| 31 | return a1 * a2;
|
---|
| 32 | }
|
---|
| 33 | };
|
---|
| 34 |
|
---|
| 35 | template <class res, class arg1, class arg2>
|
---|
| 36 | struct func<res, arg1, arg2, TMATV>
|
---|
| 37 | {
|
---|
| 38 | static EIGEN_DONT_INLINE res run( arg1& a1, arg2& a2 )
|
---|
| 39 | {
|
---|
| 40 | asm ("");
|
---|
| 41 | return a1.matrix() * a2;
|
---|
| 42 | }
|
---|
| 43 | };
|
---|
| 44 |
|
---|
| 45 | template <class res, class arg1, class arg2>
|
---|
| 46 | struct func<res, arg1, arg2, TMATVMAT>
|
---|
| 47 | {
|
---|
| 48 | static EIGEN_DONT_INLINE res run( arg1& a1, arg2& a2 )
|
---|
| 49 | {
|
---|
| 50 | asm ("");
|
---|
| 51 | return res(a1.matrix() * a2.matrix());
|
---|
| 52 | }
|
---|
| 53 | };
|
---|
| 54 |
|
---|
| 55 | template <class func, class arg1, class arg2>
|
---|
| 56 | struct test_transform
|
---|
| 57 | {
|
---|
| 58 | static void run()
|
---|
| 59 | {
|
---|
| 60 | arg1 a1;
|
---|
| 61 | a1.setIdentity();
|
---|
| 62 | arg2 a2;
|
---|
| 63 | a2.setIdentity();
|
---|
| 64 |
|
---|
| 65 | BenchTimer timer;
|
---|
| 66 | timer.reset();
|
---|
| 67 | for (int k=0; k<10; ++k)
|
---|
| 68 | {
|
---|
| 69 | timer.start();
|
---|
| 70 | for (int k=0; k<REPEAT; ++k)
|
---|
| 71 | a2 = func::run( a1, a2 );
|
---|
| 72 | timer.stop();
|
---|
| 73 | }
|
---|
| 74 | cout << setprecision(4) << fixed << timer.value() << "s " << endl;;
|
---|
| 75 | }
|
---|
| 76 | };
|
---|
| 77 |
|
---|
| 78 |
|
---|
| 79 | #define run_vec( op, scalar, mode, option, vsize ) \
|
---|
| 80 | std::cout << #scalar << "\t " << #mode << "\t " << #option << " " << #vsize " "; \
|
---|
| 81 | {\
|
---|
| 82 | typedef Transform<scalar, 3, mode, option> Trans;\
|
---|
| 83 | typedef Matrix<scalar, vsize, 1, option> Vec;\
|
---|
| 84 | typedef func<Vec,Trans,Vec,op> Func;\
|
---|
| 85 | test_transform< Func, Trans, Vec >::run();\
|
---|
| 86 | }
|
---|
| 87 |
|
---|
| 88 | #define run_trans( op, scalar, mode, option ) \
|
---|
| 89 | std::cout << #scalar << "\t " << #mode << "\t " << #option << " "; \
|
---|
| 90 | {\
|
---|
| 91 | typedef Transform<scalar, 3, mode, option> Trans;\
|
---|
| 92 | typedef func<Trans,Trans,Trans,op> Func;\
|
---|
| 93 | test_transform< Func, Trans, Trans >::run();\
|
---|
| 94 | }
|
---|
| 95 |
|
---|
| 96 | int main(int argc, char* argv[])
|
---|
| 97 | {
|
---|
| 98 | cout << "vec = trans * vec" << endl;
|
---|
| 99 | run_vec(TV, float, Isometry, AutoAlign, 3);
|
---|
| 100 | run_vec(TV, float, Isometry, DontAlign, 3);
|
---|
| 101 | run_vec(TV, float, Isometry, AutoAlign, 4);
|
---|
| 102 | run_vec(TV, float, Isometry, DontAlign, 4);
|
---|
| 103 | run_vec(TV, float, Projective, AutoAlign, 4);
|
---|
| 104 | run_vec(TV, float, Projective, DontAlign, 4);
|
---|
| 105 | run_vec(TV, double, Isometry, AutoAlign, 3);
|
---|
| 106 | run_vec(TV, double, Isometry, DontAlign, 3);
|
---|
| 107 | run_vec(TV, double, Isometry, AutoAlign, 4);
|
---|
| 108 | run_vec(TV, double, Isometry, DontAlign, 4);
|
---|
| 109 | run_vec(TV, double, Projective, AutoAlign, 4);
|
---|
| 110 | run_vec(TV, double, Projective, DontAlign, 4);
|
---|
| 111 |
|
---|
| 112 | cout << "vec = trans.matrix() * vec" << endl;
|
---|
| 113 | run_vec(TMATV, float, Isometry, AutoAlign, 4);
|
---|
| 114 | run_vec(TMATV, float, Isometry, DontAlign, 4);
|
---|
| 115 | run_vec(TMATV, double, Isometry, AutoAlign, 4);
|
---|
| 116 | run_vec(TMATV, double, Isometry, DontAlign, 4);
|
---|
| 117 |
|
---|
| 118 | cout << "trans = trans1 * trans" << endl;
|
---|
| 119 | run_trans(TV, float, Isometry, AutoAlign);
|
---|
| 120 | run_trans(TV, float, Isometry, DontAlign);
|
---|
| 121 | run_trans(TV, double, Isometry, AutoAlign);
|
---|
| 122 | run_trans(TV, double, Isometry, DontAlign);
|
---|
| 123 | run_trans(TV, float, Projective, AutoAlign);
|
---|
| 124 | run_trans(TV, float, Projective, DontAlign);
|
---|
| 125 | run_trans(TV, double, Projective, AutoAlign);
|
---|
| 126 | run_trans(TV, double, Projective, DontAlign);
|
---|
| 127 |
|
---|
| 128 | cout << "trans = trans1.matrix() * trans.matrix()" << endl;
|
---|
| 129 | run_trans(TMATVMAT, float, Isometry, AutoAlign);
|
---|
| 130 | run_trans(TMATVMAT, float, Isometry, DontAlign);
|
---|
| 131 | run_trans(TMATVMAT, double, Isometry, AutoAlign);
|
---|
| 132 | run_trans(TMATVMAT, double, Isometry, DontAlign);
|
---|
| 133 | }
|
---|
| 134 |
|
---|