diff --git a/atidlas/tools/misc.hpp b/atidlas/tools/misc.hpp index ea76f3a8a..93ef7ce2a 100644 --- a/atidlas/tools/misc.hpp +++ b/atidlas/tools/misc.hpp @@ -22,6 +22,17 @@ namespace atidlas namespace tools { +template +T median(std::vector x) +{ + size_t size = x.size(); + std::sort(x.begin(), x.end()); + if (size % 2 == 0) + return (x[size / 2 - 1] + x[size / 2]) / 2; + else + return x[size / 2]; +} + template class make_vector { public: diff --git a/bench/blas.cpp b/bench/blas.cpp index 2d3889da1..175df9c8e 100644 --- a/bench/blas.cpp +++ b/bench/blas.cpp @@ -2,6 +2,7 @@ #include "viennacl/vector.hpp" #include "viennacl/tools/timer.hpp" +#include "atidlas/tools/misc.hpp" #include "atidlas/model/import.hpp" #include "atidlas/model/model.hpp" @@ -15,13 +16,23 @@ template void bench(std::vector BLAS1_N, std::map > & models) { viennacl::tools::timer timer; + float total_time = 0; + std::vector times; + #define BENCHMARK(OP, resname) \ + times.clear();\ + total_time = 0;\ OP;\ viennacl::backend::finish();\ - timer.start(); \ - OP;\ + while(total_time < 1e-1){\ + timer.start(); \ + OP;\ + viennacl::backend::finish();\ + times.push_back(timer.get());\ + total_time += times.back();\ + }\ viennacl::backend::finish();\ - float resname = timer.get() + float resname = ad::tools::median(times); //BLAS1 { @@ -29,13 +40,13 @@ void bench(std::vector BLAS1_N, std::map x(*it), y(*it), z(*it); viennacl::scheduler::statement statement(z, viennacl::op_assign(), x + y); - BENCHMARK(models["vector-axpy-float32"]->execute(statement), time_model); BENCHMARK(models["vector-axpy-float32"]->execute(statement, true), time_unique_kernel); models["vector-axpy-float32"]->tune(statement); BENCHMARK(models["vector-axpy-float32"]->execute(statement), time_opt); - std::cout << *it << " " << time_unique_kernel << " " << time_model << " " << time_opt << std::endl; + std::cout << *it << " " << 3*(*it)*sizeof(T)*1e-9/time_unique_kernel << " " << 3*(*it)*sizeof(T)*1e-9/time_model << " " << 3*(*it)*sizeof(T)*1e-9/time_opt << std::endl; + } } @@ -51,11 +62,15 @@ std::vector create_log_range(int_t min, int_t max, int_t N) return res; } -int main() +int main(int argc, char* argv[]) { - std::map > models = ad::import("geforce_gt_540m.json"); + if(argc != 2) + { + std::cerr << "Usage : PROG model_file" << std::endl; + } + std::map > models = ad::import(argv[1]); - std::vector BLAS1_N = create_log_range(1e3, 1e7, 20); + std::vector BLAS1_N = create_log_range(1e3, 2e7, 50); std::cout << "Benchmark : BLAS" << std::endl; std::cout << "----------------" << std::endl;