Print out timing results

This commit is contained in:
Tom Deakin 2016-04-27 13:18:06 +01:00
parent 3d5a49317e
commit daa7f643b9

View File

@ -5,6 +5,8 @@
#include <cmath>
#include <limits>
#include <chrono>
#include <algorithm>
#include <iomanip>
#include "common.h"
#include "Stream.h"
@ -40,7 +42,10 @@ int main(int argc, char *argv[])
stream->write_arrays(a, b, c);
// List of times
std::vector< std::vector<double> > timings;
std::vector<double> copy_timings;
std::vector<double> mul_timings;
std::vector<double> add_timings;
std::vector<double> triad_timings;
// Declare timers
std::chrono::high_resolution_clock::time_point t1, t2;
@ -48,29 +53,30 @@ int main(int argc, char *argv[])
// Main loop
for (unsigned int k = 0; k < ntimes; k++)
{
std::vector<double> times;
// Execute Copy
t1 = std::chrono::high_resolution_clock::now();
stream->copy();
t2 = std::chrono::high_resolution_clock::now();
times.push_back(std::chrono::duration_cast<std::chrono::duration<double> >(t2 - t1).count());
copy_timings.push_back(std::chrono::duration_cast<std::chrono::duration<double> >(t2 - t1).count());
// Execute Mul
t1 = std::chrono::high_resolution_clock::now();
stream->mul();
t2 = std::chrono::high_resolution_clock::now();
times.push_back(std::chrono::duration_cast<std::chrono::duration<double> >(t2 - t1).count());
mul_timings.push_back(std::chrono::duration_cast<std::chrono::duration<double> >(t2 - t1).count());
// Execute Add
t1 = std::chrono::high_resolution_clock::now();
stream->add();
t2 = std::chrono::high_resolution_clock::now();
times.push_back(std::chrono::duration_cast<std::chrono::duration<double> >(t2 - t1).count());
add_timings.push_back(std::chrono::duration_cast<std::chrono::duration<double> >(t2 - t1).count());
// Execute Triad
t1 = std::chrono::high_resolution_clock::now();
stream->triad();
t2 = std::chrono::high_resolution_clock::now();
times.push_back(std::chrono::duration_cast<std::chrono::duration<double> >(t2 - t1).count());
timings.push_back(times);
triad_timings.push_back(std::chrono::duration_cast<std::chrono::duration<double> >(t2 - t1).count());
}
@ -78,6 +84,64 @@ int main(int argc, char *argv[])
stream->read_arrays(a, b, c);
check_solution<double>(ntimes, a, b, c);
// Crunch timing results
// Get min/max; ignore first result
auto copy_minmax = std::minmax_element(copy_timings.begin()+1, copy_timings.end());
auto mul_minmax = std::minmax_element(mul_timings.begin()+1, mul_timings.end());
auto add_minmax = std::minmax_element(add_timings.begin()+1, add_timings.end());
auto triad_minmax = std::minmax_element(triad_timings.begin()+1, triad_timings.end());
double copy_average = std::accumulate(copy_timings.begin()+1, copy_timings.end(), 0.0) / (double)(ntimes - 1);
double mul_average = std::accumulate(mul_timings.begin()+1, mul_timings.end(), 0.0) / (double)(ntimes - 1);
double add_average = std::accumulate(add_timings.begin()+1, add_timings.end(), 0.0) / (double)(ntimes - 1);
double triad_average = std::accumulate(triad_timings.begin()+1, triad_timings.end(), 0.0) / (double)(ntimes - 1);
// Display results
std::cout
<< std::left << std::setw(12) << "Function"
<< std::left << std::setw(12) << "MBytes/sec"
<< std::left << std::setw(12) << "Min (sec)"
<< std::left << std::setw(12) << "Max"
<< std::left << std::setw(12) << "Average" << std::endl;
std::cout << std::fixed;
std::cout
<< std::left << std::setw(12) << "Copy"
<< std::left << std::setw(12) << std::setprecision(3) << 1.0E-06 * (2 * sizeof(double) * ARRAY_SIZE)/(*copy_minmax.first)
<< std::left << std::setw(12) << std::setprecision(5) << *copy_minmax.first
<< std::left << std::setw(12) << std::setprecision(5) << *copy_minmax.second
<< std::left << std::setw(12) << std::setprecision(5) << copy_average
<< std::endl;
std::cout
<< std::left << std::setw(12) << "Mul"
<< std::left << std::setw(12) << std::setprecision(3) << 1.0E-06 * (2 * sizeof(double) * ARRAY_SIZE)/(*mul_minmax.first)
<< std::left << std::setw(12) << std::setprecision(5) << *mul_minmax.first
<< std::left << std::setw(12) << std::setprecision(5) << *mul_minmax.second
<< std::left << std::setw(12) << std::setprecision(5) << mul_average
<< std::endl;
std::cout
<< std::left << std::setw(12) << "Add"
<< std::left << std::setw(12) << std::setprecision(3) << 1.0E-06 * (3 * sizeof(double) * ARRAY_SIZE)/(*add_minmax.first)
<< std::left << std::setw(12) << std::setprecision(5) << *add_minmax.first
<< std::left << std::setw(12) << std::setprecision(5) << *add_minmax.second
<< std::left << std::setw(12) << std::setprecision(5) << add_average
<< std::endl;
std::cout
<< std::left << std::setw(12) << "Triad"
<< std::left << std::setw(12) << std::setprecision(3) << 1.0E-06 * (3 * sizeof(double) * ARRAY_SIZE)/(*triad_minmax.first)
<< std::left << std::setw(12) << std::setprecision(5) << *triad_minmax.first
<< std::left << std::setw(12) << std::setprecision(5) << *triad_minmax.second
<< std::left << std::setw(12) << std::setprecision(5) << triad_average
<< std::endl;
delete[] stream;
}