8 #ifndef SRC_GRID_GRID_DIST_PERFORMANCE_HPP_
9 #define SRC_GRID_GRID_DIST_PERFORMANCE_HPP_
11 #include "../../../openfpm_numerics/src/interpolation/interpolation.hpp"
12 #include "Grid/grid_dist_id.hpp"
13 #include "Plot/GoogleChart.hpp"
14 #include "interpolation/mp4_kernel.hpp"
16 #define GRID_ITERATOR_TESTS 30
17 #define GRID_INTERPOLATION_TESTS 30
31 BOOST_AUTO_TEST_SUITE( grid_iterator_performance_test )
41 void grid_interpolation_benchmark(openfpm::vector<
size_t> & nk_grid,
42 openfpm::vector<
double> & time_interpolation_p2m_mean,
43 openfpm::vector<
double> & time_interpolation_m2p_mean,
44 openfpm::vector<
double> & time_interpolation_p2m_dev,
45 openfpm::vector<
double> & time_interpolation_m2p_dev)
47 for (
size_t k = 0 ; k < nk_grid.size() ; k++)
49 size_t np = nk_grid.get(k);
50 size_t sz[] = {np,np,np};
56 size_t tot_part = np*np*np;
65 while (vd_it.isNext())
70 vd.
getPos(p)[0] = ((float)std::rand()) / RAND_MAX;
71 vd.getPos(p)[1] = ((float)std::rand()) / RAND_MAX;
72 vd.getPos(p)[2] = ((float)std::rand()) / RAND_MAX;
74 vd.template getProp<0>(p) = 1.0;
84 for (
size_t j = 0 ; j < GRID_INTERPOLATION_TESTS ; j++)
95 measures.add(tstl.
getwct());
97 standard_deviation(measures,mean,dev);
98 time_interpolation_p2m_mean.add(mean);
99 time_interpolation_p2m_dev.add(dev);
101 std::cout <<
"Time particles to mesh " << time_interpolation_p2m_mean.last() << std::endl;
103 for (
size_t j = 0 ; j < GRID_INTERPOLATION_TESTS ; j++)
111 inte.m2p<0,0>(gd,vd);
114 measures.add(tstl.
getwct());
116 standard_deviation(measures,mean,dev);
117 time_interpolation_m2p_mean.add(mean);
118 time_interpolation_m2p_dev.add(dev);
120 std::cout <<
"Time mesh to particles " << time_interpolation_m2p_mean.last() << std::endl;
141 auto st_it = g_dist.getDomainIteratorStencil(star_stencil_3D);
143 while (st_it.isNext())
146 total+= 6*g_dist.template get<0>(st_it.getStencil<0>()) -
147 g_dist.template get<0>(st_it.getStencil<1>()) -
148 g_dist.template get<0>(st_it.getStencil<2>()) -
149 g_dist.template get<0>(st_it.getStencil<3>()) -
150 g_dist.template get<0>(st_it.getStencil<4>()) -
151 g_dist.template get<0>(st_it.getStencil<5>()) -
152 g_dist.template get<0>(st_it.getStencil<6>());
166 auto norm_it = g_dist.getDomainIterator();
168 while (norm_it.isNext())
171 auto key = norm_it.get();
173 total+= 6*g_dist.template get<0>(
key) -
174 g_dist.template get<0>(
key.move(x,-1)) -
175 g_dist.template get<0>(
key.move(x,1)) -
176 g_dist.template get<0>(
key.move(y,-1)) -
177 g_dist.template get<0>(
key.move(y,1)) -
178 g_dist.template get<0>(
key.move(z,-1)) -
179 g_dist.template get<0>(
key.move(z,1));
197 std::string str(
"Testing " + std::to_string(dim) +
"D grid iterator stencil and normal");
202 for (
size_t i = 0; i < nk_grid.
size(); i++ )
207 size_t k = nk_grid.get(i);
210 BOOST_TEST_CHECKPOINT(
"Testing " << dim <<
"D vector grid iterator performance k=" << k );
214 for (
size_t i = 0; i < dim; i++)
228 auto it = g_dist.getDomainGhostIterator();
233 auto gkey = it.getGKey(p);
235 g_dist.template get<0>(p) = gkey.get(0) + gkey.get(1) + gkey.get(2);
240 g_dist.ghost_get<0>();
247 for (
size_t j = 0 ; j < GRID_ITERATOR_TESTS ; j++)
248 {measures.add(grid_iterator_benchmark_stencil(g_dist,total));}
249 standard_deviation(measures,mean,dev);
250 time_iterator_stencil_mean.add(mean);
251 time_iterator_stencil_dev.add(dev);
256 for (
size_t j = 0 ; j < GRID_ITERATOR_TESTS ;j++)
257 {measures.add(grid_iterator_benchmark_norm(g_dist,total));}
258 standard_deviation(measures,mean,dev);
259 time_iterator_normal_mean.add(mean);
260 time_iterator_normal_dev.add(dev);
262 std::cout <<
"Size: " << nk_grid.get(i) <<
" " << total << std::endl;
271 template<
unsigned int dim>
272 void grid_iterator_performance_write_report(
GoogleChart & cg,
279 std::string file_mean(test_dir);
280 std::string file_var(test_dir);
281 file_mean += std::string(
"/openfpm_pdata/grid_iterator_mean_" + std::to_string(dim) + std::string(
"_ref"));
282 file_var += std::string(
"/openfpm_pdata/grid_iterator_dev_" + std::to_string(dim) + std::string(
"_ref"));
284 std::string file_mean_save = std::string(
"grid_iterator_mean_" + std::to_string(dim) + std::to_string(
"_ref"));
285 std::string file_var_save = std::string(
"grid_iterator_dev_" + std::to_string(dim) + std::to_string(
"_ref"));
304 for (
size_t i = 0 ; i < yp_mean.
size() ; i++)
306 yp_mean.get(i).resize(time_iterator_stencil_mean.
size());
307 yp_dev.get(i).resize(time_iterator_stencil_dev.
size());
309 for (
size_t j = 0 ; j < yp_mean.get(i).
size() ; j++)
311 yp_mean.get(i).get(j).resize(2);
312 yp_dev.get(i).get(j).resize(2);
314 yp_mean.get(i).get(j).get(0) = time_iterator_stencil_mean.get(j);
315 yp_mean.get(i).get(j).get(1) = time_iterator_normal_mean.get(j);
317 yp_dev.get(i).get(j).get(0) = time_iterator_stencil_dev.get(j);
318 yp_dev.get(i).get(j).get(1) = time_iterator_normal_dev.get(j);
322 gnames.add(
"Grid iterators performance for stencil");
323 names.add(
"Stencil specialized iterator");
324 names.add(
"Normal iterator");
326 std::string y_string = std::string(
"Time seconds");
327 std::string x_string = std::string(
"Number of grid poins");
330 StandardPerformanceGraph(file_mean,
348 template<
unsigned int dim>
349 void grid_m2p_performance_write_report(
GoogleChart & cg,
354 std::string file_mean(test_dir);
355 std::string file_var(test_dir);
356 file_mean += std::string(
"/openfpm_pdata/grid_m2p_mean_" + std::to_string(dim) + std::string(
"_ref"));
357 file_var += std::string(
"/openfpm_pdata/grid_m2p_dev_" + std::to_string(dim) + std::string(
"_ref"));
359 std::string file_mean_save = std::string(
"grid_m2p_mean_" + std::to_string(dim) + std::to_string(
"_ref"));
360 std::string file_var_save = std::string(
"grid_m2p_dev_" + std::to_string(dim) + std::to_string(
"_ref"));
372 for (
size_t i = 0 ; i < yp_mean.
size() ; i++)
374 yp_mean.get(i).resize(time_iterator_stencil_mean.
size());
375 yp_dev.get(i).resize(time_iterator_stencil_dev.
size());
377 for (
size_t j = 0 ; j < yp_mean.get(i).
size() ; j++)
379 yp_mean.get(i).get(j).resize(1);
380 yp_dev.get(i).get(j).resize(1);
382 yp_mean.get(i).get(j).get(0) = time_m2p_mean.get(j);
383 yp_dev.get(i).get(j).get(0) = time_m2p_dev.get(j);
387 gnames.add(
"Grid m2p performance");
388 names.add(
"Mesh to particle performance");
390 std::string y_string = std::string(
"Time seconds");
391 std::string x_string = std::string(
"Number of grid poins");
394 StandardPerformanceGraph(file_mean,
412 BOOST_AUTO_TEST_CASE( grid_interpolation_benchmark_test )
415 nk_grid_int.add(128);
416 nk_grid_int.add(192);
419 grid_interpolation_benchmark(nk_grid_int,
426 BOOST_AUTO_TEST_CASE( grid_iterator_benchmark_test )
433 grid_iterator_benchmark<3>(nk_grid_st,
434 time_iterator_normal_mean,
435 time_iterator_stencil_mean,
436 time_iterator_normal_dev,
437 time_iterator_stencil_dev);
441 BOOST_AUTO_TEST_CASE(grid_iterator_performance_write_report_final)
446 grid_iterator_performance_write_report<3>(cg,
448 time_iterator_stencil_mean,
449 time_iterator_stencil_dev,
450 time_iterator_normal_mean,
451 time_iterator_normal_dev);
454 grid_m2p_performance_write_report<3>(cg,
459 if (create_vcluster().getProcessUnitID() == 0)
463 cg.write(
"grid_iterator_performance.html");
468 BOOST_AUTO_TEST_SUITE_END()
grid_key_dx is the key to access any element in the grid
auto getPos(vect_dist_key_dx vec_key) -> decltype(v_pos.template get< 0 >(vec_key.getKey()))
Get the position of an element.
void setHigh(int i, T val)
set the high interval of the box
double getwct()
Return the elapsed real time.
Small class to produce graph with Google chart in HTML.
This class decompose a space into sub-sub-domains and distribute them across processors.
This is a distributed grid.
void start()
Start the timer.
void setLow(int i, T val)
set the low interval of the box
void map(size_t opt=NONE)
It move all the particles that does not belong to the local processor to the respective processor...
This class is a trick to indicate the compiler a specific specialization pattern. ...
vector_dist_iterator getDomainIterator() const
Get an iterator that traverse the particles in the domain.
aggregate of properties, from a list of object if create a struct that follow the OPENFPM native stru...
Implementation of 1-D std::vector like structure.
Class for cpu time benchmarking.
Main class for interpolation Particle to mest p2m and Mesh to particle m2p.
void stop()
Stop the timer.