#include #include #include using namespace Eigen; using namespace std; #define END 9 template struct map_size { enum { ret = S }; }; template<> struct map_size<10> { enum { ret = 20 }; }; template<> struct map_size<11> { enum { ret = 50 }; }; template<> struct map_size<12> { enum { ret = 100 }; }; template<> struct map_size<13> { enum { ret = 300 }; }; template struct alt_prod { enum { ret = M==1 && N==1 ? InnerProduct : K==1 ? OuterProduct : M==1 ? GemvProduct : N==1 ? GemvProduct : GemmProduct }; }; void print_mode(int mode) { if(mode==InnerProduct) std::cout << "i"; if(mode==OuterProduct) std::cout << "o"; if(mode==CoeffBasedProductMode) std::cout << "c"; if(mode==LazyCoeffBasedProductMode) std::cout << "l"; if(mode==GemvProduct) std::cout << "v"; if(mode==GemmProduct) std::cout << "m"; } template EIGEN_DONT_INLINE void prod(const Lhs& a, const Rhs& b, Res& c) { c.noalias() += typename ProductReturnType::Type(a,b); } template EIGEN_DONT_INLINE void bench_prod() { typedef Matrix Lhs; Lhs a; a.setRandom(); typedef Matrix Rhs; Rhs b; b.setRandom(); typedef Matrix Res; Res c; c.setRandom(); BenchTimer t; double n = 2.*double(M)*double(N)*double(K); int rep = 100000./n; rep /= 2; if(rep<1) rep = 1; do { rep *= 2; t.reset(); BENCH(t,1,rep,prod(a,b,c)); } while(t.best()<0.1); t.reset(); BENCH(t,5,rep,prod(a,b,c)); print_mode(Mode); std::cout << int(1e-6*n*rep/t.best()) << "\t"; } template struct print_n; template struct loop_on_m; template struct loop_on_n; template struct loop_on_k { static void run() { std::cout << "K=" << K << "\t"; print_n::run(); std::cout << "\n"; loop_on_m::run(); std::cout << "\n\n"; loop_on_k::run(); } }; template struct loop_on_k { static void run(){} }; template struct loop_on_m { static void run() { std::cout << M << "f\t"; loop_on_n::run(); std::cout << "\n"; std::cout << M << "f\t"; loop_on_n::run(); std::cout << "\n"; loop_on_m::run(); } }; template struct loop_on_m { static void run(){} }; template struct loop_on_n { static void run() { bench_prod::ret : Mode>(); loop_on_n::run(); } }; template struct loop_on_n { static void run(){} }; template struct print_n { static void run() { std::cout << map_size::ret << "\t"; print_n::run(); } }; template<> struct print_n { static void run(){} }; int main() { loop_on_k<1,1,1>::run(); return 0; }