diff --git a/Grid/Benchmark_Grid.cpp b/Grid/Benchmark_Grid.cpp
index 841f26e..9fd4ced 100644
--- a/Grid/Benchmark_Grid.cpp
+++ b/Grid/Benchmark_Grid.cpp
@@ -19,6 +19,7 @@ along with this program. If not, see .
*/
#include "Common.hpp"
+#include "json.hpp"
#include
using namespace Grid;
@@ -32,6 +33,8 @@ double mflop_ref_err;
int NN_global;
+nlohmann::json json_results;
+
struct time_statistics
{
double mean;
@@ -215,6 +218,13 @@ class Benchmark
double rate_max = rate * timestat.mean / timestat.min;
grid_printf("%5d %5d %15d %15.2f %15.2f %15.1f %15.2f\n", lat, dir, bytes,
timestat.mean, rate, rate_err, rate_max);
+ nlohmann::json tmp;
+ tmp["L"] = lat;
+ tmp["dir"] = dir;
+ tmp["bytes"] = bytes;
+ tmp["time"] = timestat.mean;
+ tmp["GB_per_second"] = rate;
+ json_results["comms"].push_back(tmp);
}
}
for (int d = 0; d < 8; d++)
@@ -304,6 +314,13 @@ class Benchmark
<< " \t\t" << bytes / time << "\t\t" << flops / time << "\t\t"
<< (stop - start) / 1000. / 1000. << "\t\t" << bytes / time / NN
<< std::endl;
+
+ nlohmann::json tmp;
+ tmp["L"] = lat;
+ tmp["bytes"] = bytes;
+ tmp["gflops"] = flops / time;
+ tmp["GB_per_second"] = bytes / time;
+ json_results["axpy"].push_back(tmp);
}
};
@@ -378,6 +395,13 @@ class Benchmark
<< " \t\t" << bytes / time << "\t\t" << flops / time << "\t\t"
<< (stop - start) / 1000. / 1000. << "\t\t" << bytes / time / NN
<< std::endl;
+
+ nlohmann::json tmp;
+ tmp["L"] = lat;
+ tmp["bytes"] = bytes;
+ tmp["GB_per_second"] = bytes / time;
+ tmp["gflops"] = flops / time;
+ json_results["SU4"].push_back(tmp);
}
};
@@ -811,6 +835,13 @@ int main(int argc, char **argv)
{
Grid_init(&argc, &argv);
+ std::string json_filename = ""; // empty indicates no json output
+ for (int i = 0; i < argc; i++)
+ {
+ if (std::string(argv[i]) == "--json-out")
+ json_filename = argv[i + 1];
+ }
+
CartesianCommunicator::SetCommunicatorPolicy(
CartesianCommunicator::CommunicatorPolicySequential);
#ifdef KNL
@@ -820,10 +851,10 @@ int main(int argc, char **argv)
#endif
Benchmark::Decomposition();
- int do_su4 = 0;
- int do_memory = 0;
+ int do_su4 = 1;
+ int do_memory = 1;
int do_comms = 1;
- int do_flops = 0;
+ int do_flops = 1;
int Ls = 1;
int sel = 4;
@@ -905,6 +936,12 @@ int main(int argc, char **argv)
{
std::cout << GridLogMessage << L_list[l] << " \t\t " << wilson[l] << " \t\t "
<< dwf4[l] << " \t\t " << staggered[l] << std::endl;
+ nlohmann::json tmp;
+ tmp["L"] = L_list[l];
+ tmp["mflops_wilson"] = wilson[l];
+ tmp["mflops_dwf4"] = dwf4[l];
+ tmp["mflops_staggered"] = staggered[l];
+ json_results["flops"].push_back(tmp);
}
std::cout
<< GridLogMessage
@@ -999,5 +1036,19 @@ int main(int argc, char **argv)
<< std::endl;
}
+ if (!json_filename.empty())
+ {
+ std::cout << GridLogMessage << "writing benchmark results to " << json_filename
+ << std::endl;
+
+ int me = 0;
+ MPI_Comm_rank(MPI_COMM_WORLD, &me);
+ if (me == 0)
+ {
+ std::ofstream json_file(json_filename);
+ json_file << std::setw(4) << json_results;
+ }
+ }
+
Grid_finalize();
}