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 135