9 #ifndef SRC_VECTOR_VECTOR_DIST_CL_PERFORMANCE_TESTS_HPP_
10 #define SRC_VECTOR_VECTOR_DIST_CL_PERFORMANCE_TESTS_HPP_
12 #include "Vector/vector_dist.hpp"
13 #include "data_type/aggregate.hpp"
14 #include "Plot/GoogleChart.hpp"
15 #include "cl_part_performance_graph.hpp"
19 BOOST_AUTO_TEST_SUITE( celllist_part_reorder_performance_test )
24 openfpm::vector<
float> r_cutoff {0.004, 0.007, 0.01};
32 size_t k_start = 100000;
59 template<
unsigned int dim>
void cell_list_part_reorder_random_benchmark(
size_t cl_k_start,
66 cl_time_rand_mean.resize(cl_r_cutoff.
size());
67 cl_time_rand_dev.resize(cl_r_cutoff.
size());
69 std::string str(
"Testing " + std::to_string(dim) +
"D vector, no-order, Cell-list");
74 for (
size_t r = 0; r < cl_r_cutoff.
size(); r++ )
79 float r_cut = cl_r_cutoff.get(r);
85 size_t k_count = 1 + log2(k/cl_k_min);
88 for (
size_t k_int = k ; k_int >= cl_k_min ; k_int/=2 )
90 BOOST_TEST_CHECKPOINT(
"Testing " << dim <<
"D vector without an Hilbert curve reordering k=" << k_int );
92 if (cl_n_particles.
size() < k_count)
93 cl_n_particles.add(k_int);
97 for (
size_t i = 0; i < dim; i++)
106 for (
size_t i = 0; i < dim; i++)
112 vd_initialize<dim>(vd, v_cl, k_int);
114 vd.template ghost_get<0>();
118 auto NN = vd.getCellList(r_cut);
119 double sum_fr_mean = 0;
120 double sum_fr_dev = 0;
122 benchmark_get_celllist(NN,vd,r_cut);
128 for ( ; l < N_STAT_TEST; l++)
129 measures.add(benchmark_calc_forces<dim>(NN,vd,r_cut));
130 standard_deviation(measures,sum_fr_mean,sum_fr_dev);
132 cl_time_rand_mean.get(r).add(sum_fr_mean);
133 cl_time_rand_dev.get(r).add(sum_fr_dev);
135 if (v_cl.getProcessUnitID() == 0)
136 std::cout <<
"Cut-off = " << r_cut <<
", Particles = " << k_int <<
" time to calculate forces: " << sum_fr_mean <<
" dev: " << sum_fr_dev << std::endl;
146 template<
unsigned int dim>
void cell_list_part_reorder_hilbert_benchmark(
size_t cl_k_start,
159 cl_time_hilb_mean.resize(cl_r_cutoff.
size());
160 cl_time_hilb_dev.resize(cl_r_cutoff.
size());
161 for (
size_t r = 0; r < cl_time_hilb_mean.size(); r++)
163 cl_time_hilb_mean.get(r).resize(cl_n_particles.
size());
164 cl_time_hilb_dev.get(r).resize(cl_n_particles.
size());
165 for (
size_t k = 0; k < cl_time_hilb_mean.get(r).size(); k++)
167 cl_time_hilb_mean.get(r).get(k).resize(cl_orders.
size());
168 cl_time_hilb_dev.get(r).get(k).resize(cl_orders.
size());
173 cl_time_reorder_hilb_mean.resize(cl_r_cutoff.
size());
174 cl_time_reorder_hilb_dev.resize(cl_r_cutoff.
size());
175 for (
size_t r = 0; r < cl_time_reorder_hilb_mean.size(); r++)
177 cl_time_reorder_hilb_mean.get(r).resize(cl_n_particles.
size());
178 cl_time_reorder_hilb_dev.get(r).resize(cl_n_particles.
size());
179 for (
size_t k = 0; k < cl_time_reorder_hilb_mean.get(r).size(); k++)
181 cl_time_reorder_hilb_mean.get(r).get(k).resize(cl_orders.
size());
182 cl_time_reorder_hilb_dev.get(r).get(k).resize(cl_orders.
size());
187 std::string str(
"Testing " + std::to_string(dim) +
"D vector, Hilbert curve reordering, Cell-List");
191 for (
size_t r = 0; r < cl_r_cutoff.
size(); r++ )
193 Vcluster & v_cl = create_vcluster();
196 float r_cut = cl_r_cutoff.get(r);
202 for (
size_t i = 0; i < cl_orders.
size(); i++)
204 size_t m = cl_orders.get(i);
207 for (
size_t k_int = k ; k_int >= cl_k_min ; k_int/=2, part++ )
209 BOOST_TEST_CHECKPOINT(
"Testing " << dim <<
"D vector with an Hilbert curve reordering k=" << k_int );
213 for (
size_t i = 0; i < dim; i++)
222 for (
size_t i = 0; i < dim; i++)
228 vd_initialize<dim>(vd, v_cl, k_int);
232 double sum_reorder_mean = 0;
233 double sum_reorder_dev = 0;
237 for (
size_t h = 0 ; h < N_STAT_TEST; h++)
238 measures.add(benchmark_reorder(vd,m));
239 standard_deviation(measures,sum_reorder_mean,sum_reorder_dev);
242 cl_time_reorder_hilb_mean.get(r).get(part).get(i) = sum_reorder_mean;
243 cl_time_reorder_hilb_dev.get(r).get(part).get(i) = sum_reorder_dev;
245 vd.template ghost_get<0>();
249 auto NN = vd.getCellList(r_cut);
250 benchmark_get_celllist(NN,vd,r_cut);
254 double sum_fr_mean = 0;
255 double sum_fr_dev = 0;
258 for (
size_t l = 0 ; l < N_STAT_TEST ; l++)
259 measures.add(benchmark_calc_forces<dim>(NN,vd,r_cut));
260 standard_deviation(measures,sum_fr_mean,sum_fr_dev);
262 cl_time_hilb_mean.get(r).get(part).get(i) = sum_fr_mean;
263 cl_time_hilb_dev.get(r).get(part).get(i) = sum_fr_dev;
266 if (v_cl.getProcessUnitID() == 0)
267 std::cout <<
"Cut-off = " << r_cut <<
", Particles = " << k_int <<
". Time to reorder: " << sum_reorder_mean <<
" dev: " << sum_reorder_dev <<
" time calculate forces: " << sum_fr_mean <<
" dev: " << sum_fr_dev << std::endl;
279 template<
unsigned int dim>
void cell_list_part_reorder_report(
GoogleChart & cg,
293 for (
size_t i = 0; i < cl_n_particles.
size() ; i++)
294 x.add(cl_n_particles.get(i));
298 cl_part_time<dim>(cg,
307 cl_part_reorder_time<dim>(cg,
311 cl_time_reorder_mean,
312 cl_time_reorder_dev);
317 BOOST_AUTO_TEST_CASE( vector_dist_cl_random_test )
320 cell_list_part_reorder_random_benchmark<3>(k_start,k_min,r_cutoff,n_particles,time_rand_mean,time_rand_dev);
321 cell_list_part_reorder_random_benchmark<2>(k_start,k_min,r_cutoff,n_particles,time_rand_2_mean,time_rand_2_dev);
324 BOOST_AUTO_TEST_CASE( vector_dist_cl_hilbert_test )
327 cell_list_part_reorder_hilbert_benchmark<3>(k_start,
339 cell_list_part_reorder_hilbert_benchmark<2>(k_start,
352 BOOST_AUTO_TEST_CASE(vector_dist_cl_performance_write_report)
357 cell_list_part_reorder_report<3>(cg,
369 cell_list_part_reorder_report<2>(cg,
383 if (create_vcluster().getProcessUnitID() == 0)
384 cg.write(
"Celllist_part_ord.html");
387 BOOST_AUTO_TEST_SUITE_END()
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.
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.