8 #ifndef SRC_VECTOR_VECTOR_DIST_VERLET_PERFORMANCE_TESTS_HPP_
9 #define SRC_VECTOR_VECTOR_DIST_VERLET_PERFORMANCE_TESTS_HPP_
17 void print_test_v(std::string test,
size_t sz)
19 if (create_vcluster().getProcessUnitID() == 0)
20 std::cout << test <<
" " << sz <<
"\n";
23 BOOST_AUTO_TEST_SUITE( verletlist_part_reorder_performance_test )
28 openfpm::vector<
float> r_cutoff {0.004, 0.007, 0.01};
31 size_t k_start = 100000;
55 template<
unsigned int dim>
void vd_verlet_random_benchmark(
size_t k_start,
64 time_force_mean.resize(r_cutoff.
size());
65 time_create_mean.resize(r_cutoff.
size());
66 time_force_dev.resize(r_cutoff.
size());
67 time_create_dev.resize(r_cutoff.
size());
69 std::string str(
"Testing " + std::to_string(dim) +
"D vector no-order, Verlet-list");
74 for (
size_t r = 0; r < r_cutoff.
size(); r++ )
79 float r_cut = r_cutoff.get(r);
85 size_t k_count = 1 + log2(k/k_min);
87 for (
size_t k_int = k ; k_int >= k_min ; k_int/=2 )
89 BOOST_TEST_CHECKPOINT(
"Testing " << dim <<
"D vector without an Hilbert curve reordering k=" << k_int );
91 if (n_particles.
size() < k_count)
92 n_particles.add(k_int);
96 for (
size_t i = 0; i < dim; i++)
104 for (
size_t i = 0; i < dim; i++)
110 vd_initialize<dim>(vd, v_cl, k_int);
112 vd.template ghost_get<0>();
117 double sum_verlet_mean = 0;
118 double sum_verlet_dev = 0;
119 for (
size_t n = 0 ; n < N_STAT_TEST; n++)
120 measures.add(benchmark_get_verlet(vd,r_cut));
121 standard_deviation(measures,sum_verlet_mean,sum_verlet_dev);
124 time_create_mean.get(r).add(sum_verlet_mean);
125 time_create_dev.get(r).add(sum_verlet_dev);
129 auto NN = vd.getCellList(r_cut);
130 double sum_fr_mean = 0;
131 double sum_fr_dev = 0;
134 for (
size_t l = 0 ; l < N_STAT_TEST ; l++)
135 measures.add(benchmark_calc_forces<dim>(NN,vd,r_cut));
136 standard_deviation(measures,sum_fr_mean,sum_fr_dev);
137 time_force_mean.get(r).add(sum_fr_mean);
138 time_force_dev.get(r).add(sum_fr_dev);
140 if (v_cl.getProcessUnitID() == 0)
141 std::cout <<
"Particles: " << k_int <<
"," <<
"cut-off: " << r_cut <<
" time to construct a Verlet list = " << sum_verlet_mean <<
" dev: " << sum_verlet_dev <<
" calculate force = " << sum_fr_mean <<
" dev: " << sum_fr_dev << std::endl;
152 time_hilb.resize(r_cutoff.
size());
153 for (
size_t r = 0; r < time_hilb.size(); r++)
155 time_hilb.get(r).resize(n_particles.
size());
156 for (
size_t k = 0; k < time_hilb.get(r).size(); k++)
158 time_hilb.get(r).get(k).resize(orders.
size());
162 time_total_hilb.resize(r_cutoff.
size());
163 for (
size_t r = 0; r < time_total_hilb.size(); r++)
165 time_total_hilb.get(r).resize(n_particles.
size());
166 for (
size_t k = 0; k < time_total_hilb.get(r).size(); k++)
168 time_total_hilb.get(r).get(k).resize(orders.
size());
172 std::string str(
"Testing " + std::to_string(dim) +
"D vector, Hilbert curve reordering, Verlet-list");
176 for (
size_t r = 0; r < r_cutoff.
size(); r++ )
178 Vcluster & v_cl = create_vcluster();
181 float r_cut = r_cutoff.get(r);
187 for (
size_t i = 0; i < orders.
size(); i++)
189 size_t m = orders.get(i);
192 for (
size_t k_int = k ; k_int >= k_min ; k_int/=2, part++ )
194 BOOST_TEST_CHECKPOINT(
"Testing " << dim <<
"D vector with an Hilbert curve reordering k=" << k_int );
198 for (
size_t i = 0; i < dim; i++)
207 for (
size_t i = 0; i < dim; i++)
213 vd_initialize<dim>(vd, v_cl, k_int);
215 vd.template ghost_get<0>();
219 double sum_reorder = 0;
220 for (
size_t h = 0 ; h < N_VERLET_TEST; h++)
221 sum_reorder += benchmark_reorder(vd,m);
222 sum_reorder /= N_VERLET_TEST;
226 double sum_verlet = 0;
228 for (
size_t n = 0 ; n < N_VERLET_TEST; n++)
229 sum_verlet += benchmark_get_verlet(vd,r_cut);
230 sum_verlet /= N_VERLET_TEST;
232 time_total_hilb.get(r).get(part).get(i) = sum_verlet;
236 auto NN = vd.getCellList(r_cut);
237 double sum_forces = 0;
239 for (
size_t l = 0 ; l < N_VERLET_TEST; l++)
240 sum_forces += benchmark_calc_forces<dim>(NN,vd,r_cut);
241 sum_forces /= N_VERLET_TEST;
242 time_hilb.get(r).get(part).get(i) = sum_forces;
244 if (v_cl.getProcessUnitID() == 0)
245 std::cout <<
"Order = " << m <<
", Cut-off = " << r_cut <<
", Particles = " << k_int <<
". Time to reorder: " << sum_reorder <<
" time to get the verlet-list: " << sum_verlet <<
" time to calculate forces: " << sum_forces << std::endl;
255 template<
unsigned int dim>
void vd_verlet_performance_write_report(
GoogleChart & cg,
264 std::string file_mean(test_dir);
265 std::string file_var(test_dir);
266 file_mean += std::string(
"/openfpm_pdata/verlet_comp_force_mean_" + std::to_string(dim) + std::string(
"_ref"));
267 file_var += std::string(
"/openfpm_pdata/verlet_comp_force_dev_" + std::to_string(dim) + std::string(
"_ref"));
269 std::string file_mean_save = std::string(
"verlet_comp_force_mean_" + std::to_string(dim) + std::to_string(
"_ref"));
270 std::string file_var_save = std::string(
"verlet_comp_force_dev_" + std::to_string(dim) + std::to_string(
"_ref"));
280 yp_mean.resize(time_force_mean.
size());
281 yp_dev.resize(time_force_dev.
size());
282 for (
size_t i = 0 ; i < yp_mean.
size() ; i++)
284 yp_mean.get(i).resize(time_force_mean.get(i).
size());
285 yp_dev.get(i).resize(time_force_dev.get(i).
size());
287 for (
size_t j = 0 ; j < yp_mean.get(i).
size() ; j++)
289 yp_mean.get(i).get(j).resize(1);
290 yp_dev.get(i).get(j).resize(1);
292 yp_mean.get(i).get(j).get(0) = time_force_mean.get(i).get(j);
293 yp_dev.get(i).get(j).get(0) = time_force_dev.get(i).get(j);
297 names.add(
"Force verlet");
299 for (
size_t i = 0 ; i < r_cutoff.
size() ; i++)
300 gnames.add(
"Verlet-list performance, cut-off radius: " + std::to_string(r_cutoff.get(i)));
302 std::string y_string = std::string(
"Time to calculate forces (s)");
303 std::string x_string = std::string(
"Number of particles");
305 std::string str(
"<h1>Verlet-list " + std::to_string(dim) +
"-D performance test force calculation: </h1>");
308 StandardPerformanceGraph(file_mean,
325 std::string file_mean(test_dir);
326 std::string file_var(test_dir);
327 file_mean += std::string(
"/openfpm_pdata/verlet_comp_create_mean_" + std::to_string(dim) + std::string(
"_ref"));
328 file_var += std::string(
"/openfpm_pdata/verlet_comp_create_dev_" + std::to_string(dim) + std::string(
"_ref"));
330 std::string file_mean_save = std::string(
"verlet_comp_create_mean_" + std::to_string(dim) + std::to_string(
"_ref"));
331 std::string file_var_save = std::string(
"verlet_comp_create_dev_" + std::to_string(dim) + std::to_string(
"_ref"));
341 yp_mean.resize(time_create_mean.
size());
342 yp_dev.resize(time_create_dev.
size());
343 for (
size_t i = 0 ; i < yp_mean.
size() ; i++)
345 yp_mean.get(i).resize(time_create_mean.get(i).
size());
346 yp_dev.get(i).resize(time_create_dev.get(i).
size());
348 for (
size_t j = 0 ; j < yp_mean.get(i).
size() ; j++)
350 yp_mean.get(i).get(j).resize(1);
351 yp_dev.get(i).get(j).resize(1);
353 yp_mean.get(i).get(j).get(0) = time_create_mean.get(i).get(j);
354 yp_dev.get(i).get(j).get(0) = time_create_dev.get(i).get(j);
358 names.add(
"Create verlet");
360 for (
size_t i = 0 ; i < r_cutoff.
size() ; i++)
361 gnames.add(
"Verlet-list performance, cut-off radius: " + std::to_string(r_cutoff.get(i)));
363 std::string y_string = std::string(
"Time to construct a verlet-list (s)");
364 std::string x_string = std::string(
"Number of particles");
366 std::string str(
"<h1>Verlet-list " + std::to_string(dim) +
"-D performance test force calculation: </h1>");
369 StandardPerformanceGraph(file_mean,
385 BOOST_AUTO_TEST_CASE( vector_dist_verlet_test )
388 vd_verlet_random_benchmark<3>(k_start,k_min,r_cutoff,n_particles,time_force_mean,time_create_mean,time_force_dev,time_create_dev);
389 vd_verlet_random_benchmark<2>(k_start,k_min,r_cutoff,n_particles,time_force_mean_2,time_create_mean_2,time_force_dev_2,time_create_dev_2);
392 BOOST_AUTO_TEST_CASE(vector_dist_verlet_performance_write_report)
397 vd_verlet_performance_write_report<3>(cg,r_cutoff,n_particles,time_force_mean,time_force_dev,time_create_mean,time_create_dev);
398 vd_verlet_performance_write_report<2>(cg,r_cutoff,n_particles,time_force_mean_2,time_force_dev_2,time_create_mean_2,time_create_dev_2);
400 if (create_vcluster().getProcessUnitID() == 0)
404 cg.write(
"Verletlist_comp.html");
408 BOOST_AUTO_TEST_SUITE_END()
void addHTML(const std::string &html)
Add HTML text.
void setHigh(int i, T val)
set the high interval of the box
Implementation of VCluster class.
Small class to produce graph with Google chart in HTML.
This class decompose a space into sub-sub-domains and distribute them across processors.
void setLow(int i, T val)
set the low interval of the box
This class represent an N-dimensional box.
size_t getProcessingUnits()
Get the total number of processors.