diff --git a/src/main.cpp b/src/main.cpp index 7dab5c7..50bc51f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,6 +5,8 @@ #include #include #include +#include +#include #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 > timings; + std::vector copy_timings; + std::vector mul_timings; + std::vector add_timings; + std::vector 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 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 >(t2 - t1).count()); + copy_timings.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(); - times.push_back(std::chrono::duration_cast >(t2 - t1).count()); + mul_timings.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(); - times.push_back(std::chrono::duration_cast >(t2 - t1).count()); + add_timings.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(); - times.push_back(std::chrono::duration_cast >(t2 - t1).count()); - - timings.push_back(times); + triad_timings.push_back(std::chrono::duration_cast >(t2 - t1).count()); } @@ -78,6 +84,64 @@ 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 + 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; }