diff --git a/src/Vector/performance/cl_comp_performance_graph.hpp b/src/Vector/performance/cl_comp_performance_graph.hpp new file mode 100644 index 0000000000000000000000000000000000000000..f9750488222656eb72bc17a0124514ff41b464bc --- /dev/null +++ b/src/Vector/performance/cl_comp_performance_graph.hpp @@ -0,0 +1,281 @@ +/* + * performance_graph.hpp + * + * Created on: Dec 23, 2016 + * Author: i-bird + */ + +#ifndef SRC_VECTOR_PERFORMANCE_CL_COMP_PERFORMANCE_GRAPH_HPP_ +#define SRC_VECTOR_PERFORMANCE_CL_COMP_PERFORMANCE_GRAPH_HPP_ + +#include "Plot/GoogleChart.hpp" + +/////////////////////////// COMPUTATIONAL HILBERT CURVE ORDERING /////////////////////////////////////// + +/*! \brief Time to calculate forces using random order or hilber curve compute ordering + * + * \tparam dim dimensionality of the test + * + * \param cg GoogleChart object + * \param cl_n_particles number of particles for each test + * \param cl_r_cutoff cell-list spacing used to construct a cell-list + * \param cl_time_hilb for each particle set, for each cut-off radius time to calculate the forces (Hilbert curve order) + * \param cl_time_rand for each particle set, for each cut-off radius, time to calculate the forces (no order) + * + */ +template<unsigned int dim> void cl_comp_normal_vs_hilbert_force_time(GoogleChart & cg, + openfpm::vector<size_t> & cl_n_particles, + openfpm::vector<float> & cl_r_cutoff, + openfpm::vector<openfpm::vector<double>> & cl_time_hilb_mean, + openfpm::vector<openfpm::vector<double>> & cl_time_rand_mean, + openfpm::vector<openfpm::vector<double>> & cl_time_hilb_dev, + openfpm::vector<openfpm::vector<double>> & cl_time_rand_dev, + double & warning_level, + double & norm) +{ + // Get the test dir + std::string file_mean(test_dir); + std::string file_var(test_dir); + file_mean += std::string("/openfpm_pdata/cl_comp_norm_hilbert_mean_" + std::to_string(dim) + std::string("_ref")); + file_var += std::string("/openfpm_pdata/cl_comp_norm_hilbert_dev_" + std::to_string(dim) + std::string("_ref")); + + openfpm::vector<openfpm::vector<openfpm::vector<double>>> y_ref_mean; + openfpm::vector<openfpm::vector<openfpm::vector<double>>> y_ref_dev; + y_ref_mean.load(file_mean); + y_ref_dev.load(file_var); + + openfpm::vector<int> warning_vlevel; + + // time graphs data + + openfpm::vector<size_t> x; + openfpm::vector<openfpm::vector<openfpm::vector<double>>> y; + openfpm::vector<openfpm::vector<openfpm::vector<double>>> y_dev; + + openfpm::vector<std::string> yn; + + for (size_t i = 0; i < cl_n_particles.size() ; i++) + x.add(cl_n_particles.get(i)); + + yn.add("Random cell list"); + yn.add("Hilbert cell list"); + + y.resize(cl_time_hilb_mean.size()); + y_dev.resize(cl_time_hilb_mean.size()); + for (size_t r = 0; r < cl_time_hilb_mean.size(); r++) + { + y.get(r).resize(cl_time_hilb_mean.get(r).size()); + y_dev.get(r).resize(cl_time_hilb_mean.get(r).size()); + for (size_t k = 0; k < cl_time_hilb_mean.get(r).size(); k++) + { + // Time for construction hilbert and random + y.get(r).get(k).add(cl_time_rand_mean.get(r).get(k)); + y.get(r).get(k).add(cl_time_hilb_mean.get(r).get(k)); + + y_dev.get(r).get(k).add(cl_time_rand_dev.get(r).get(k)); + y_dev.get(r).get(k).add(cl_time_hilb_dev.get(r).get(k)); + } + } + + y.save("cl_comp_norm_hilbert_mean_" + std::to_string(dim) + std::to_string("_ref")); + y_dev.save("cl_comp_norm_hilbert_dev_" + std::to_string(dim) + std::to_string("_ref")); + + if (y_ref_mean.size() != 0) + { + // We reconstruct y and yn + + y.clear(); + yn.clear(); + + yn.add("Random cell list"); + yn.add("interval"); + yn.add("interval"); + yn.add("Hilbert cell list"); + yn.add("interval"); + yn.add("interval"); + y.resize(cl_time_hilb_mean.size()); + for (size_t r = 0; r < cl_time_hilb_mean.size(); r++) + { + int warning_level = -1; + + y.get(r).resize(cl_time_hilb_mean.get(r).size()); + for (size_t k = 0; k < cl_time_hilb_mean.get(r).size(); k++) + { + // Time for construction hilbert and random + y.get(r).get(k).add(cl_time_rand_mean.get(r).get(k)); + + y.get(r).get(k).add(y_ref_mean.get(r).get(k).get(0) - 3.0*y_ref_dev.get(r).get(k).get(0)); + y.get(r).get(k).add(y_ref_mean.get(r).get(k).get(0) + 3.0*y_ref_dev.get(r).get(k).get(0)); + y.get(r).get(k).add(cl_time_hilb_mean.get(r).get(k)); + y.get(r).get(k).add(y_ref_mean.get(r).get(k).get(1) - 3.0*y_ref_dev.get(r).get(k).get(1)); + y.get(r).get(k).add(y_ref_mean.get(r).get(k).get(1) + 3.0*y_ref_dev.get(r).get(k).get(1)); + + warning_set(warning_level,cl_time_rand_mean.get(r).get(k),y_ref_mean.get(r).get(k).get(0),y_ref_dev.get(r).get(k).get(0)); + warning_set(warning_level,cl_time_hilb_mean.get(r).get(k),y_ref_mean.get(r).get(k).get(1),y_ref_dev.get(r).get(k).get(1)); + } + + warning_vlevel.add(warning_level); + } + } + + // Force time calculation + + // Google charts options + GCoptions options; + + options.yAxis = std::string("Time to calculate force"); + options.xAxis = std::string("Number of particles"); + options.lineWidth = 4; + + std::string str("<h1>Cell-list " + std::to_string(dim) + "-D performance test: </h1>"); + str += "<h2> 1) Time to calculate forces</h2>"; + cg.addHTML(str); + + for (size_t i = 0; i < cl_r_cutoff.size(); i++) + { + std::string chart_area; + if (warning_vlevel.size() != 0) + addchartarea(chart_area,warning_vlevel.get(i)); + options.more = GC_Y_LOG + "," + GC_ZOOM + chart_area; + + options.title = std::string("Cell-list performance, cut-off radius: " + std::to_string(cl_r_cutoff.get(i))); + cg.AddLinesGraph(x,y.get(i),yn,options); + } +} + +/*! \brief Output the graph normal cell-list vs Hilbert cell-list (Total time) + * + * \tparam dim dimensionality of the test + * + * \param cg GoogleChart object + * \param cl_n_particles number of particles for each test + * \param cl_r_cutoff cell-list spacing used to construct a cell-list + * \param cl_time_force_hilb for each particle set, for each cut-off radius, for each order time to calculate the forces + * \param cl_time_force_rand for each particle set, for each cut-off radius, time to calculate the forces + * + */ +template<unsigned int dim> void cl_comp_normal_vs_hilbert_create_time(GoogleChart & cg, + openfpm::vector<size_t> & cl_n_particles, + openfpm::vector<float> & cl_r_cutoff, + openfpm::vector<openfpm::vector<double>> & cl_time_create_hilb_mean, + openfpm::vector<openfpm::vector<double>> & cl_time_create_rand_mean, + openfpm::vector<openfpm::vector<double>> & cl_time_create_hilb_dev, + openfpm::vector<openfpm::vector<double>> & cl_time_create_rand_dev, + double & warning_level, + double & norm) +{ + // Get the test dir + std::string file_mean(test_dir); + std::string file_var(test_dir); + file_mean += std::string("/openfpm_pdata/cl_comp_create_norm_hilbert_mean_" + std::to_string(dim) + std::string("_ref")); + file_var += std::string("/openfpm_pdata/cl_comp_create_norm_hilbert_dev_" + std::to_string(dim) + std::string("_ref")); + + openfpm::vector<openfpm::vector<openfpm::vector<double>>> y_ref_mean; + openfpm::vector<openfpm::vector<openfpm::vector<double>>> y_ref_dev; + y_ref_mean.load(file_mean); + y_ref_dev.load(file_var); + + // warning level + openfpm::vector<int> warning_vlevel; + + // Calculation time graphs data + + openfpm::vector<size_t> x; + openfpm::vector<openfpm::vector<openfpm::vector<double>>> y2; + openfpm::vector<openfpm::vector<openfpm::vector<double>>> y2_dev; + openfpm::vector<std::string> yn2; + + yn2.add("Random cell list"); + yn2.add("Hilbert cell list"); + + for (size_t i = 0; i < cl_n_particles.size() ; i++) + x.add(cl_n_particles.get(i)); + + y2.resize(cl_time_create_hilb_mean.size()); + y2_dev.resize(cl_time_create_hilb_mean.size()); + for (size_t r = 0; r < cl_time_create_hilb_mean.size(); r++) + { + y2.get(r).resize(cl_time_create_hilb_mean.get(r).size()); + y2_dev.get(r).resize(cl_time_create_hilb_mean.get(r).size()); + for (size_t k = 0; k < cl_time_create_hilb_mean.get(r).size(); k++) + { + // Put a total time + y2.get(r).get(k).add(cl_time_create_rand_mean.get(r).get(k)); + y2.get(r).get(k).add(cl_time_create_hilb_mean.get(r).get(k)); + + y2_dev.get(r).get(k).add(cl_time_create_rand_dev.get(r).get(k)); + y2_dev.get(r).get(k).add(cl_time_create_hilb_dev.get(r).get(k)); + } + } + + y2.save("cl_comp_create_norm_hilbert_mean_" + std::to_string(dim) + std::to_string("_ref")); + y2_dev.save("cl_comp_create_norm_hilbert_dev_" + std::to_string(dim) + std::to_string("_ref")); + + if (y_ref_mean.size() != 0) + { + // We reconstruct y and yn + + y2.clear(); + yn2.clear(); + + yn2.add("Random cell list"); + yn2.add("interval"); + yn2.add("interval"); + yn2.add("Hilbert cell list"); + yn2.add("interval"); + yn2.add("interval"); + + y2.resize(cl_time_create_hilb_mean.size()); + for (size_t r = 0; r < cl_time_create_hilb_mean.size(); r++) + { + int warning_level = -1; + + y2.get(r).resize(cl_time_create_hilb_mean.get(r).size()); + for (size_t k = 0; k < cl_time_create_hilb_mean.get(r).size(); k++) + { + // Time for construction hilbert and random + y2.get(r).get(k).add(cl_time_create_rand_mean.get(r).get(k)); + y2.get(r).get(k).add(y_ref_mean.get(r).get(k).get(0) - 3.0*y_ref_dev.get(r).get(k).get(0)); + y2.get(r).get(k).add(y_ref_mean.get(r).get(k).get(0) + 3.0*y_ref_dev.get(r).get(k).get(0)); + y2.get(r).get(k).add(cl_time_create_hilb_mean.get(r).get(k)); + y2.get(r).get(k).add(y_ref_mean.get(r).get(k).get(1) - 3.0*y_ref_dev.get(r).get(k).get(1)); + y2.get(r).get(k).add(y_ref_mean.get(r).get(k).get(1) + 3.0*y_ref_dev.get(r).get(k).get(1)); + + warning_set(warning_level,cl_time_create_rand_mean.get(r).get(k),y_ref_mean.get(r).get(k).get(0),y_ref_dev.get(r).get(k).get(0)); + warning_set(warning_level,cl_time_create_rand_mean.get(r).get(k),y_ref_mean.get(r).get(k).get(1),y_ref_dev.get(r).get(k).get(1)); + } + + warning_vlevel.add(warning_level); + } + } + + // Calculation time graphs report + + // Google charts options + GCoptions options2; + + options2.yAxis = std::string("Time to create the cell-list"); + options2.xAxis = std::string("Number of particles"); + options2.lineWidth = 4; + + std::string str2("<h2>2) Time to create the cell-list</h2>"); + cg.addHTML(str2); + + for (size_t i = 0; i < cl_r_cutoff.size(); i++) + { + std::string chart_area; + if (warning_vlevel.size() != 0) + addchartarea(chart_area,warning_vlevel.get(i)); + options2.more = GC_Y_LOG + "," + GC_ZOOM + chart_area; + + options2.title = std::string("Cell-list performance, cut-off radius: " + std::to_string(cl_r_cutoff.get(i))); + cg.AddLinesGraph(x,y2.get(i),yn2,options2); + } +} + + +///////////////////////////////// PARTICLE REORDERING ////////////////////////////////////////////////////// + + + +#endif /* SRC_VECTOR_PERFORMANCE_CL_COMP_PERFORMANCE_GRAPH_HPP_ */ diff --git a/src/Vector/performance/cl_part_performance_graph.hpp b/src/Vector/performance/cl_part_performance_graph.hpp new file mode 100644 index 0000000000000000000000000000000000000000..c4d3346ac42c59dbd2d63bb6182cad7f7dd53dc7 --- /dev/null +++ b/src/Vector/performance/cl_part_performance_graph.hpp @@ -0,0 +1,268 @@ +/* + * cl_part_performance_graph.hpp + * + * Created on: Dec 23, 2016 + * Author: i-bird + */ + +#ifndef SRC_VECTOR_PERFORMANCE_CL_PART_PERFORMANCE_GRAPH_HPP_ +#define SRC_VECTOR_PERFORMANCE_CL_PART_PERFORMANCE_GRAPH_HPP_ + + +template<unsigned int dim> void cl_part_time(GoogleChart & cg, + openfpm::vector<size_t> & cl_n_particles, + openfpm::vector<float> & cl_r_cutoff, + openfpm::vector<size_t> &cl_orders, + openfpm::vector<openfpm::vector<openfpm::vector<double>>> cl_time_hilb_mean, + openfpm::vector<openfpm::vector<double>> cl_time_rand_mean, + openfpm::vector<openfpm::vector<openfpm::vector<double>>> cl_time_hilb_dev, + openfpm::vector<openfpm::vector<double>> cl_time_rand_dev) +{ + // Get the test dir + std::string file_mean(test_dir); + std::string file_var(test_dir); + file_mean += std::string("/openfpm_pdata/cl_part_norm_hilbert_mean_" + std::to_string(dim) + std::string("_ref")); + file_var += std::string("/openfpm_pdata/cl_part_norm_hilbert_dev_" + std::to_string(dim) + std::string("_ref")); + + openfpm::vector<openfpm::vector<openfpm::vector<double>>> y_ref_mean; + openfpm::vector<openfpm::vector<openfpm::vector<double>>> y_ref_dev; + y_ref_mean.load(file_mean); + y_ref_dev.load(file_var); + + // warning level + openfpm::vector<int> warning_vlevel; + + // Speedup graphs data + + openfpm::vector<size_t> x; + openfpm::vector<openfpm::vector<openfpm::vector<double>>> y; + openfpm::vector<openfpm::vector<openfpm::vector<double>>> y_dev; + openfpm::vector<std::string> yn; + + for (size_t i = 0; i < cl_n_particles.size() ; i++) + x.add(cl_n_particles.get(i)); + + for (size_t i = 0; i < cl_orders.size(); i++) + yn.add("Order of: " + std::to_string(cl_orders.get(i))); + yn.add("No-order"); + + // Add reorder time + y.resize(cl_time_hilb_mean.size()); + y_dev.resize(cl_time_hilb_dev.size()); + for (size_t r = 0; r < cl_time_hilb_mean.size(); r++) + { + y.get(r).resize(cl_time_hilb_mean.get(r).size()); + y_dev.get(r).resize(cl_time_hilb_mean.get(r).size()); + for (size_t k = 0; k < cl_time_hilb_mean.get(r).size(); k++) + { + // reorder time + for (size_t m = 0; m < cl_time_hilb_mean.get(r).get(k).size(); m++) + { + // Put time + y.get(r).get(k).add(cl_time_hilb_mean.get(r).get(k).get(m)); + y_dev.get(r).get(k).add(cl_time_hilb_dev.get(r).get(k).get(m)); + } + + // no reorder time + y.get(r).get(k).add(cl_time_rand_mean.get(r).get(k)); + y_dev.get(r).get(k).add(cl_time_rand_dev.get(r).get(k)); + } + } + + // Save y + y.save("cl_part_norm_hilbert_mean_" + std::to_string(dim) + std::to_string("_ref")); + y_dev.save("cl_part_norm_hilbert_dev_" + std::to_string(dim) + std::to_string("_ref")); + + if (y_ref_mean.size() != 0) + { + yn.clear(); + y.clear(); + + for (size_t i = 0; i < cl_orders.size(); i++) + { + yn.add("Order of: " + std::to_string(cl_orders.get(i))); + yn.add("interval"); + yn.add("interval"); + } + + yn.add("No-order"); + yn.add("interval"); + yn.add("interval"); + + // Add reorder time + y.resize(cl_time_hilb_mean.size()); + for (size_t r = 0; r < cl_time_hilb_mean.size(); r++) + { + int warning_level = -1; + + y.get(r).resize(cl_time_hilb_mean.get(r).size()); + for (size_t k = 0; k < cl_time_hilb_mean.get(r).size(); k++) + { + // reorder time + size_t m = 0; + for ( ; m < cl_time_hilb_mean.get(r).get(k).size(); m++) + { + // Put time + y.get(r).get(k).add(cl_time_hilb_mean.get(r).get(k).get(m)); + y.get(r).get(k).add(y_ref_mean.get(r).get(k).get(m) - 3.0*y_ref_dev.get(r).get(k).get(m) ); + y.get(r).get(k).add(y_ref_mean.get(r).get(k).get(m) + 3.0*y_ref_dev.get(r).get(k).get(m) ); + + warning_set(warning_level,cl_time_hilb_mean.get(r).get(k).get(m),y_ref_mean.get(r).get(k).get(m),y_ref_dev.get(r).get(k).get(m)); + } + + // no reorder time + y.get(r).get(k).add(cl_time_rand_mean.get(r).get(k)); + y.get(r).get(k).add(y_ref_mean.get(r).get(k).get(m) - 3.0*y_ref_dev.get(r).get(k).get(m) ); + y.get(r).get(k).add(y_ref_mean.get(r).get(k).get(m) + 3.0*y_ref_dev.get(r).get(k).get(m) ); + + warning_set(warning_level,cl_time_rand_mean.get(r).get(k),y_ref_mean.get(r).get(k).get(m),y_ref_dev.get(r).get(k).get(m)); + } + + warning_vlevel.add(warning_level); + } + } + + // Speedup graphs report + + // Google charts options + GCoptions options; + + options.yAxis = std::string("Time (s)"); + options.xAxis = std::string("Number of particles"); + options.lineWidth = 2; + options.more = GC_Y_LOG + "," + GC_ZOOM; + + //options.more = "hAxis: {logScale: true}"; + + std::string str("<h1>Cell-list " + std::to_string(dim) + "-D performance tests: </h1>"); + str += "<h2> 1) Time to calculate forces in the case of particles randomly ordered in a vector of particles, and in the case of particles ordered along an hilbert curve of order N</h2>"; + + cg.addHTML(str); + + for (size_t i = 0; i < cl_r_cutoff.size(); i++) + { + options.title = std::string("Cell-list performance, cut-off radius: " + std::to_string(cl_r_cutoff.get(i))); + cg.AddLinesGraph(x,y.get(i),yn,options); + } +} + +template<unsigned int dim> void cl_part_reorder_time(GoogleChart & cg, + openfpm::vector<size_t> & cl_n_particles, + openfpm::vector<float> & cl_r_cutoff, + openfpm::vector<size_t> &cl_orders, + openfpm::vector<openfpm::vector<openfpm::vector<double>>> cl_time_reorder_mean, + openfpm::vector<openfpm::vector<openfpm::vector<double>>> cl_time_reorder_dev) +{ + // Get the test dir + std::string file_mean(test_dir); + std::string file_var(test_dir); + file_mean += std::string("/openfpm_pdata/cl_part_reorder_hilbert_mean_" + std::to_string(dim) + std::string("_ref")); + file_var += std::string("/openfpm_pdata/cl_part_reorder_hilbert_dev_" + std::to_string(dim) + std::string("_ref")); + + openfpm::vector<openfpm::vector<openfpm::vector<double>>> y_ref_mean; + openfpm::vector<openfpm::vector<openfpm::vector<double>>> y_ref_dev; + y_ref_mean.load(file_mean); + y_ref_dev.load(file_var); + + // warning level + openfpm::vector<int> warning_vlevel; + + // graphs data + openfpm::vector<size_t> x; + openfpm::vector<openfpm::vector<openfpm::vector<double>>> y; + openfpm::vector<openfpm::vector<openfpm::vector<double>>> y_dev; + openfpm::vector<std::string> yn; + + for (size_t i = 0; i < cl_n_particles.size() ; i++) + x.add(cl_n_particles.get(i)); + + for (size_t i = 0; i < cl_orders.size(); i++) + yn.add("Order of: " + std::to_string(cl_orders.get(i))); + + // Add reorder time + y.resize(cl_time_reorder_mean.size()); + y_dev.resize(cl_time_reorder_dev.size()); + for (size_t r = 0; r < cl_time_reorder_mean.size(); r++) + { + y.get(r).resize(cl_time_reorder_mean.get(r).size()); + y_dev.get(r).resize(cl_time_reorder_mean.get(r).size()); + for (size_t k = 0; k < cl_time_reorder_mean.get(r).size(); k++) + { + // reorder time + for (size_t m = 0; m < cl_time_reorder_mean.get(r).get(k).size(); m++) + { + // Put time + y.get(r).get(k).add(cl_time_reorder_mean.get(r).get(k).get(m)); + y_dev.get(r).get(k).add(cl_time_reorder_dev.get(r).get(k).get(m)); + } + } + } + + // Save y + y.save("cl_part_reorder_hilbert_mean_" + std::to_string(dim) + std::to_string("_ref")); + y_dev.save("cl_part_reorder_hilbert_dev_" + std::to_string(dim) + std::to_string("_ref")); + + if (y_ref_mean.size() != 0) + { + yn.clear(); + y.clear(); + + size_t i = cl_orders.size()-1; + yn.add("Order of: " + std::to_string(cl_orders.get(i))); + yn.add("interval"); + yn.add("interval"); + + // Add reorder time + y.resize(cl_time_reorder_mean.size()); + for (size_t r = 0; r < cl_time_reorder_mean.size(); r++) + { + int warning_level = -1; + + y.get(r).resize(cl_time_reorder_mean.get(r).size()); + for (size_t k = 0; k < cl_time_reorder_mean.get(r).size(); k++) + { + // reorder time + size_t m = cl_orders.size()-1; + + // Put time + y.get(r).get(k).add(cl_time_reorder_mean.get(r).get(k).get(m)); + y.get(r).get(k).add(y_ref_mean.get(r).get(k).get(m) - 3.0*y_ref_dev.get(r).get(k).get(m) ); + y.get(r).get(k).add(y_ref_mean.get(r).get(k).get(m) + 3.0*y_ref_dev.get(r).get(k).get(m) ); + + warning_set(warning_level,cl_time_reorder_mean.get(r).get(k).get(m),y_ref_mean.get(r).get(k).get(m),y_ref_dev.get(r).get(k).get(m)); + } + + warning_vlevel.add(warning_level); + } + } + + // Speedup graphs report + + // Google charts options + GCoptions options; + + options.yAxis = std::string("Time (s)"); + options.xAxis = std::string("Number of particles"); + options.lineWidth = 2; + options.more = GC_ZOOM; + + //options.more = "hAxis: {logScale: true}"; + + std::string str("<h1>Cell-list " + std::to_string(dim) + "-D performance tests: </h1>"); + str += "<h2> 1) Time to reorder the distributed vector</h2>"; + + cg.addHTML(str); + + for (size_t i = 0; i < cl_r_cutoff.size(); i++) + { + std::string chart_area; + if (warning_vlevel.size() != 0) + addchartarea(chart_area,warning_vlevel.get(i)); + options.more = GC_Y_LOG + "," + GC_ZOOM + chart_area; + + options.title = std::string("Cell-list performance, cut-off radius: " + std::to_string(cl_r_cutoff.get(i))); + cg.AddLinesGraph(x,y.get(i),yn,options); + } +} + +#endif /* SRC_VECTOR_PERFORMANCE_CL_PART_PERFORMANCE_GRAPH_HPP_ */