diff --git a/src/Graph/dist_map_graph.hpp b/src/Graph/dist_map_graph.hpp index d6519512ad2081fd135e9d674b7890ed8fd383fb..372170f359d995ecbc9d0c54065521ed48c66aa9 100644 --- a/src/Graph/dist_map_graph.hpp +++ b/src/Graph/dist_map_graph.hpp @@ -1924,13 +1924,17 @@ public: e.swap(g.e); e_m.swap(g.e_m); v_l.swap(g.v_l); - glb2id = g.glb2id; - id2glb = g.id2glb; - glb2loc = g.glb2loc; + glb2id.swap(g.glb2id); + id2glb.swap(g.id2glb); + glb2loc.swap(g.glb2loc); e_l.swap(g.e_l); e_invalid.swap(g.e_invalid); - vtxdist = g.vtxdist; - fvtxdist = g.fvtxdist; + vtxdist.swap(g.vtxdist); + fvtxdist.swap(g.fvtxdist); + + size_t v_slot_tmp = v_slot; + v_slot = g.v_slot; + g.v_slot = v_slot_tmp; } /*! \brief Swap the memory of g with this graph @@ -1948,13 +1952,17 @@ public: e.swap(g.e); e_m.swap(g.e_m); v_l.swap(g.v_l); - glb2id = g.glb2id; - id2glb = g.id2glb; - glb2loc = g.glb2loc; + glb2id.swap(g.glb2id); + id2glb.swap(g.id2glb); + glb2loc.swap(g.glb2loc); e_l.swap(g.e_l); e_invalid.swap(g.e_invalid); - vtxdist = g.vtxdist; - fvtxdist = g.fvtxdist; + vtxdist.swap(g.vtxdist); + fvtxdist.swap(g.fvtxdist); + + size_t v_slot_tmp = v_slot; + v_slot = g.v_slot; + g.v_slot = v_slot_tmp; } /*! \brief Get the vertex iterator diff --git a/src/Vector/performance/verlet_performance_tests.hpp b/src/Vector/performance/verlet_performance_tests.hpp index be588f25a4472386afaa81d706129c1b5b1c9cb8..271f0273057e2dc183932b6b508ea7f069a92c4c 100644 --- a/src/Vector/performance/verlet_performance_tests.hpp +++ b/src/Vector/performance/verlet_performance_tests.hpp @@ -248,194 +248,6 @@ template<unsigned int dim> void vd_verlet_performance_write_report(GoogleChart & openfpm::vector<openfpm::vector<double>> time_create_mean, openfpm::vector<openfpm::vector<double>> time_create_dev) { -/* // Get the test dir - std::string file_mean(test_dir); - std::string file_var(test_dir); - file_mean += std::string("/openfpm_pdata/verlet_comp_create_mean_" + std::to_string(dim) + std::string("_ref")); - file_var += std::string(); - - openfpm::vector<openfpm::vector<openfpm::vector<double>>> y_ref_create_mean; - openfpm::vector<openfpm::vector<openfpm::vector<double>>> y_ref_create_dev; - y_ref_create_mean.load(file_mean); - y_ref_create_dev.load(file_var); - - // warning level - openfpm::vector<int> warning_vlevel; - - // Get the test dir - std::string file_mean2(test_dir); - std::string file_var2(test_dir); - file_mean2 += std::string("/openfpm_pdata/verlet_comp_force_mean_" + std::to_string(dim) + std::string("_ref")); - file_var2 += std::string("/openfpm_pdata/verlet_comp_force_dev_" + std::to_string(dim) + std::string("_ref")); - - openfpm::vector<openfpm::vector<openfpm::vector<double>>> y_ref_force_mean; - openfpm::vector<openfpm::vector<openfpm::vector<double>>> y_ref_force_dev; - y_ref_force_mean.load(file_mean2); - y_ref_force_dev.load(file_var2); - - // warning level - openfpm::vector<int> warning_vlevel2; - - // 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; - - yn.add("Force verlet"); - for (size_t i = 0; i < n_particles.size() ; i++) - x.add(n_particles.get(i)); - - y.resize(time_force_mean.size()); - y_dev.resize(time_force_mean.size()); - for (size_t r = 0; r < time_force_mean.size(); r++) - { - y.get(r).resize(time_force_mean.get(r).size()); - y_dev.get(r).resize(time_force_mean.get(r).size()); - for (size_t k = 0; k < time_force_mean.get(r).size(); k++) - { - // Put the speedup - y.get(r).get(k).add(time_force_mean.get(r).get(k)); - - y_dev.get(r).get(k).add(time_force_dev.get(r).get(k)); - } - } - - y.save("verlet_comp_force_mean_" + std::to_string(dim) + std::to_string("_ref")); - y_dev.save("verlet_comp_force_dev_" + std::to_string(dim) + std::to_string("_ref")); - - if (y_ref_force_mean.size() != 0) - { - yn.clear(); - - yn.add("Force verlet"); - yn.add("interval"); - yn.add("interval"); - - y.clear(); - y.resize(time_force_mean.size()); - for (size_t r = 0; r < time_force_mean.size(); r++) - { - int warning_level = -1; - - y.get(r).resize(time_force_mean.get(r).size()); - y_dev.get(r).resize(time_force_mean.get(r).size()); - for (size_t k = 0; k < time_force_mean.get(r).size(); k++) - { - // Put the speedup - y.get(r).get(k).add(time_force_mean.get(r).get(k)); - y.get(r).get(k).add(y_ref_force_mean.get(r).get(k).get(0) - 3.0*y_ref_force_dev.get(r).get(k).get(0) ); - y.get(r).get(k).add(y_ref_force_mean.get(r).get(k).get(0) + 3.0*y_ref_force_dev.get(r).get(k).get(0) ); - - warning_set(warning_level,time_force_mean.get(r).get(k),y_ref_force_mean.get(r).get(k).get(0),y_ref_force_dev.get(r).get(k).get(0)); - } - - warning_vlevel.add(warning_level); - } - } - - // Calculation time graphs data - - openfpm::vector<openfpm::vector<openfpm::vector<double>>> y2; - openfpm::vector<openfpm::vector<openfpm::vector<double>>> y2_dev; - openfpm::vector<std::string> yn2; - - yn2.add("Create a Verlet"); - - y2.resize(time_create_mean.size()); - y2_dev.resize(time_create_mean.size()); - for (size_t r = 0; r < time_create_mean.size(); r++) - { - y2.get(r).resize(time_create_mean.get(r).size()); - y2_dev.get(r).resize(time_create_mean.get(r).size()); - for (size_t k = 0; k < time_create_mean.get(r).size(); k++) - { - // Put a random case total time - y2.get(r).get(k).add(time_create_mean.get(r).get(k)); - - y2_dev.get(r).get(k).add(time_create_dev.get(r).get(k)); - } - } - - y2.save("verlet_comp_create_mean_" + std::to_string(dim) + std::to_string("_ref")); - y2_dev.save("verlet_comp_create_dev_" + std::to_string(dim) + std::to_string("_ref")); - - if (y_ref_create_mean.size() != 0) - { - yn2.clear(); - yn2.add("Create a Verlet"); - yn2.add("interval"); - yn2.add("interval"); - - y2.clear(); - - y2.resize(time_create_mean.size()); - for (size_t r = 0; r < time_create_mean.size(); r++) - { - int warning_level = -1; - - y2.get(r).resize(time_create_mean.get(r).size()); - for (size_t k = 0; k < time_create_mean.get(r).size(); k++) - { - // Put a random case total time - y2.get(r).get(k).add(time_create_mean.get(r).get(k)); - - y2.get(r).get(k).add(y_ref_create_mean.get(r).get(k).get(0) - 3.0*y_ref_create_dev.get(r).get(k).get(0) ); - y2.get(r).get(k).add(y_ref_create_mean.get(r).get(k).get(0) + 3.0*y_ref_create_dev.get(r).get(k).get(0) ); - - warning_set(warning_level,time_create_mean.get(r).get(k),y_ref_create_mean.get(r).get(k).get(0),y_ref_create_dev.get(r).get(k).get(0)); - } - - warning_vlevel2.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; - - std::string str("<h1>Verlet-list " + std::to_string(dim) + "-D performance test force calculation: </h1>"); - cg.addHTML(str); - - for (size_t i = 0; i < 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("Verlet-list cut-off radius: " + std::to_string(r_cutoff.get(i))); - cg.AddLinesGraph(x,y.get(i),yn,options); - } - - // Calculation time graphs report - - // Google charts options - GCoptions options2; - - options2.yAxis = std::string("Time to construct a verlet-list (s)"); - options2.xAxis = std::string("Number of particles"); - options2.lineWidth = 2; - - std::string str2("<h2>2) Time to construct a Verlet-list time</h2>"); - cg.addHTML(str2); - - for (size_t i = 0; i < r_cutoff.size(); i++) - { - std::string chart_area; - if (warning_vlevel.size() != 0) - addchartarea(chart_area,warning_vlevel2.get(i)); - options2.more = GC_ZOOM + chart_area; - - options2.title = std::string("Verlet-list performance, cut-off radius: " + std::to_string(r_cutoff.get(i))); - cg.AddLinesGraph(x,y2.get(i),yn2,options2); - }*/ - { std::string file_mean(test_dir); std::string file_var(test_dir); diff --git a/src/Vector/vector_dist.hpp b/src/Vector/vector_dist.hpp index f6516758c84d63000b33694cabe550217151f92b..bced135d33674505f1ca919155bec31cef233518 100644 --- a/src/Vector/vector_dist.hpp +++ b/src/Vector/vector_dist.hpp @@ -982,7 +982,9 @@ public: * \tparam op which kind of operation to apply * \tparam prp list of properties to get synchronize * - * \param opt options NO_CHANGE_ELEMENTS + * \param opt_ options. It is an optional parameter. + * If set to NO_CHANGE_ELEMENTS the communication has lower latencies. This option has some usage limitations, so please refere to the examples + * for further explanations * * */ @@ -1237,6 +1239,8 @@ public: * * \param NN Cell-List neighborhood * + * \return Particle iterator + * */ template<typename cli> ParticleItCRS_Cells<dim,cli> getParticleIteratorCRS(cli & NN) { diff --git a/src/Vector/vector_dist_comm.hpp b/src/Vector/vector_dist_comm.hpp index b052bcf0e8cd64f0778b65b2db576bf4da51eb08..355035dd300eb4149a87e952ac5b267eff70c845 100644 --- a/src/Vector/vector_dist_comm.hpp +++ b/src/Vector/vector_dist_comm.hpp @@ -558,10 +558,13 @@ class vector_dist_comm /*! \brief allocate and fill the send buffer for the map function + * + * \tparam prp_object object type to send + * \tparam prp properties to send * * \param v_pos vector of particle positions * \param v_prp vector of particle properties - * \param prc_r List of processor rank involved in the send + * \param prc_sz_r number of particles to send for each processor * \param m_pos sending buffer for position * \param m_prp sending buffer for properties * @@ -601,7 +604,6 @@ class vector_dist_comm * \param v_pos vector of particle positions * \param lbl_p Particle labeled * \param prc_sz For each processor the number of particles to send - * \param opart id of the particles to send * */ template<typename obp> void labelParticleProcessor(openfpm::vector<Point<dim, St>> & v_pos, openfpm::vector<aggregate<size_t,size_t,size_t>> & lbl_p, openfpm::vector<size_t> & prc_sz) @@ -662,6 +664,7 @@ class vector_dist_comm * * \param v_pos vector of particle positions * \param v_prp vector of particle properties + * \param prc for each particle it label the processor id (the owner of the particle, or where it should go the particle) * \param g_m ghost marker * */ @@ -768,7 +771,7 @@ public: * */ vector_dist_comm(Decomposition && dec) - :v_cl(create_vcluster()),dec(dec) + :v_cl(create_vcluster()),dec(dec),lg_m(0) { } diff --git a/src/Vector/vector_dist_iterator.hpp b/src/Vector/vector_dist_iterator.hpp index 4e307cd62b572fc3a4fd17bc29d8158866eb93fa..20426a29028b44bf18f5698655cb05dd43b816c3 100644 --- a/src/Vector/vector_dist_iterator.hpp +++ b/src/Vector/vector_dist_iterator.hpp @@ -11,19 +11,21 @@ #include "vector_dist_key.hpp" #include "VCluster/VCluster.hpp" +//! Iterator that Iterate across particle indexes class vector_dist_iterator { //! Actual iterator size_t v_it; + //! end point size_t stop; public: /*! \brief Constructor of the distributed grid * - * \param gk the set of local vectors - * \param offset iterator starting point + * \param start start point + * \param stop end point * */ vector_dist_iterator(size_t start, size_t stop) diff --git a/src/Vector/vector_dist_key.hpp b/src/Vector/vector_dist_key.hpp index fb99c0e1b1dd626c134be3cd2576c808a8c7fc38..97bfac2e16d74bb13a6a8561eaab50ac6b682920 100644 --- a/src/Vector/vector_dist_key.hpp +++ b/src/Vector/vector_dist_key.hpp @@ -26,7 +26,7 @@ public: /*! \brief set the key * - * \return the local key + * \param key the local key * */ inline void setKey(size_t key) @@ -44,7 +44,9 @@ public: return key; } - /*! \brief Convert the key into a message + /*! \brief Convert the key into a string message + * + * \return a string message * */ std::string to_string() @@ -56,11 +58,13 @@ public: return ts.str(); } + //! constructor from a key inline vect_dist_key_dx(size_t key) :key(key) { } + //! Default constructor inline vect_dist_key_dx() { } diff --git a/src/Vector/vector_dist_ofb.hpp b/src/Vector/vector_dist_ofb.hpp index bb9923766e43ee7be8c76dab98fc3166d506ac94..ec56d7bbbeec179e491e876c6cb64ec518fd6e2f 100644 --- a/src/Vector/vector_dist_ofb.hpp +++ b/src/Vector/vector_dist_ofb.hpp @@ -20,6 +20,8 @@ struct KillParticle * \param pp_id particle id * \param p_id processor id * + * \return -1 + * */ static size_t out(size_t pp_id, size_t p_id) { @@ -27,6 +29,7 @@ struct KillParticle } }; +//! Out-of-bound policy kill the particle but print a warning struct KillParticleWithWarning { /*! \brief It decide what to do when the particle is out @@ -34,8 +37,10 @@ struct KillParticleWithWarning * \param pp_id particle id * \param p_id processor id * + * \return -1 + * */ - static size_t out(size_t p_id) + static size_t out(size_t pp_id, size_t p_id) { std::cerr << "Warning: " << __FILE__ << ":" << __LINE__ << " out of bound particle detected "; @@ -43,6 +48,7 @@ struct KillParticleWithWarning } }; +//! Out-of-bound policy do nothing struct Nothing { /*! \brief It decide what to do when the particle is out @@ -50,13 +56,16 @@ struct Nothing * \param pp_id particle id * \param p_id processor id * + * \return -1 + * */ - static size_t out(size_t p_id) + static size_t out(size_t pp_id, size_t p_id) { - return p_id; + return -1; } }; +//! Out-of-bound policy kill the program struct Error { /*! \brief It decide what to do when the particle is out @@ -64,8 +73,10 @@ struct Error * \param pp_id particle id * \param p_id processor id * + * \return -1 + * */ - static size_t out(size_t p_id) + static size_t out(size_t pp_id, size_t p_id) { std::cerr << "Error: " << __FILE__ << ":" << __LINE__ << " out of bound particle detected "; diff --git a/src/dec_optimizer_unit_test.hpp b/src/dec_optimizer_unit_test.hpp index 28b387a5868a9f03c9c849a2164caed7db94ed4f..eeaf821c4f561fff2fe68321add4cae930223554 100644 --- a/src/dec_optimizer_unit_test.hpp +++ b/src/dec_optimizer_unit_test.hpp @@ -138,7 +138,7 @@ BOOST_AUTO_TEST_CASE( dec_optimizer_disconnected_subdomains_np) Vcluster & vcl = create_vcluster(); // Test for only 3 processors - if (vcl.getProcessingUnits() > 3) + if (vcl.getProcessingUnits() != 3) return; CartesianGraphFactory<2,Graph_CSR<nm_v,nm_e>> g_factory;