From 8d88afdedb52fd9a19c4a76ff6eae6fead5f0e24 Mon Sep 17 00:00:00 2001 From: Tom Deakin Date: Thu, 28 Apr 2016 11:57:09 +0100 Subject: [PATCH] Tidy up timing printing to reduce code duplication --- src/main.cpp | 82 +++++++++++++++++++--------------------------------- 1 file changed, 29 insertions(+), 53 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 71cb478..42dbe28 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -41,10 +41,7 @@ int main(int argc, char *argv[]) stream->write_arrays(a, b, c); // List of times - std::vector copy_timings; - std::vector mul_timings; - std::vector add_timings; - std::vector triad_timings; + std::vector> timings(4); // Declare timers std::chrono::high_resolution_clock::time_point t1, t2; @@ -52,30 +49,29 @@ int main(int argc, char *argv[]) // Main loop for (unsigned int k = 0; k < ntimes; k++) { - // Execute Copy t1 = std::chrono::high_resolution_clock::now(); stream->copy(); t2 = std::chrono::high_resolution_clock::now(); - copy_timings.push_back(std::chrono::duration_cast >(t2 - t1).count()); + timings[0].push_back(std::chrono::duration_cast >(t2 - t1).count()); // Execute Mul t1 = std::chrono::high_resolution_clock::now(); stream->mul(); t2 = std::chrono::high_resolution_clock::now(); - mul_timings.push_back(std::chrono::duration_cast >(t2 - t1).count()); + timings[1].push_back(std::chrono::duration_cast >(t2 - t1).count()); // Execute Add t1 = std::chrono::high_resolution_clock::now(); stream->add(); t2 = std::chrono::high_resolution_clock::now(); - add_timings.push_back(std::chrono::duration_cast >(t2 - t1).count()); + timings[2].push_back(std::chrono::duration_cast >(t2 - t1).count()); // Execute Triad t1 = std::chrono::high_resolution_clock::now(); stream->triad(); t2 = std::chrono::high_resolution_clock::now(); - triad_timings.push_back(std::chrono::duration_cast >(t2 - t1).count()); + timings[3].push_back(std::chrono::duration_cast >(t2 - t1).count()); } @@ -83,21 +79,7 @@ int main(int argc, char *argv[]) stream->read_arrays(a, b, c); check_solution(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 + // Display timing results std::cout << std::left << std::setw(12) << "Function" << std::left << std::setw(12) << "MBytes/sec" @@ -107,39 +89,33 @@ int main(int argc, char *argv[]) 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::string labels[4] = {"Copy", "Mul", "Add", "Triad"}; + size_t sizes[4] = { + 2 * sizeof(double) * ARRAY_SIZE, + 2 * sizeof(double) * ARRAY_SIZE, + 3 * sizeof(double) * ARRAY_SIZE, + 3 * sizeof(double) * ARRAY_SIZE + }; + for (int i = 0; i < 4; i++) + { + // Get min/max; ignore the first result + auto minmax = std::minmax_element(timings[i].begin()+1, timings[i].end()); - 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; + // Calculate average; ignore the first result + double average = std::accumulate(timings[i].begin()+1, timings[i].end(), 0.0) / (double)(ntimes - 1); + // Display results + std::cout + << std::left << std::setw(12) << labels[i] + << std::left << std::setw(12) << std::setprecision(3) << 1.0E-6 * sizes[i] / (*minmax.first) + << std::left << std::setw(12) << std::setprecision(5) << *minmax.first + << std::left << std::setw(12) << std::setprecision(5) << *minmax.second + << std::left << std::setw(12) << std::setprecision(5) << 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;