#include #include #include #include "dnn.hpp" // Function: measure_time_taskflow std::chrono::milliseconds measure_time_taskflow( unsigned num_epochs, unsigned num_threads ) { auto dnn {build_dnn(num_epochs)}; auto t1 = std::chrono::high_resolution_clock::now(); run_taskflow(dnn, num_threads); auto t2 = std::chrono::high_resolution_clock::now(); return std::chrono::duration_cast(t2 - t1); } // Function: measure_time_omp std::chrono::milliseconds measure_time_omp( unsigned num_epochs, unsigned num_threads ) { auto dnn {build_dnn(num_epochs)}; auto t1 = std::chrono::high_resolution_clock::now(); run_omp(dnn, num_threads); auto t2 = std::chrono::high_resolution_clock::now(); return std::chrono::duration_cast(t2 - t1); } // Function: measure_time_tbb std::chrono::milliseconds measure_time_tbb( unsigned num_epochs, unsigned num_threads ) { auto dnn {build_dnn(num_epochs)}; auto t1 = std::chrono::high_resolution_clock::now(); run_tbb(dnn, num_threads); auto t2 = std::chrono::high_resolution_clock::now(); return std::chrono::duration_cast(t2 - t1); } // Procedure void mnist( const std::string& model, const unsigned min_epochs, const unsigned max_epochs, const unsigned num_threads, const unsigned num_rounds ) { std::cout << std::setw(12) << "epochs" << std::setw(12) << "runtime" << std::endl; for(unsigned epochs=min_epochs; epochs <= max_epochs; epochs += 10) { double runtime {0.0}; for(unsigned i=0; icheck([] (const std::string& m) { if(m != "tbb" && m != "omp" && m != "tf") { return "model name should be \"tbb\", \"omp\", or \"tf\""; } return ""; }); CLI11_PARSE(app, argc, argv); std::cout << "model=" << model << ' ' << "num_threads=" << num_threads << ' ' << "num_rounds=" << num_rounds << ' ' << "min_epochs=" << min_epochs << ' ' << "max_epochs=" << max_epochs << ' ' << std::endl; mnist(model, min_epochs, max_epochs, num_threads, num_rounds); return EXIT_SUCCESS; }