Home | History | Annotate | Download | only in bench
      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