From ad949badfc4deeab0b69da578ae2f5020635655a Mon Sep 17 00:00:00 2001 From: Behzad Safaei <bsafaei0@login02.leonardo.local> Date: Fri, 9 May 2025 12:35:16 +0200 Subject: [PATCH] Randomize indices for benchmarks --- examples/benchmarks/sd_static.cpp | 21 +++++++++++++++++++ examples/benchmarks/sd_static_triangular.cpp | 22 +++++++++++++++++++- runtime/pairs.hpp | 1 + 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/examples/benchmarks/sd_static.cpp b/examples/benchmarks/sd_static.cpp index aad4801..96bed63 100644 --- a/examples/benchmarks/sd_static.cpp +++ b/examples/benchmarks/sd_static.cpp @@ -4,6 +4,21 @@ #include "spring_dashpot.hpp" +void randomaize_indices(PairsAccessor ac){ + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution<> dist(0, ac.nlocal() - 1); + + ac.syncPosition(PairsAccessor::Host); + for (int i=0; i<ac.nlocal(); ++i){ + int j = dist(gen); + auto tmp = ac.getPosition(i); + ac.setPosition(i, ac.getPosition(j)); + ac.setPosition(j, tmp); + } + ac.syncPosition(PairsAccessor::Host); +} + int main(int argc, char **argv) { if(argc!=5){ std::cerr << "4 args are required: Domain size (i.e. number of particles) in x,y,z and #timesteps." << std::endl; @@ -15,6 +30,8 @@ int main(int argc, char **argv) { auto pairs_sim = std::make_shared<PairsSimulation>(); pairs_sim->initialize(); + + PairsAccessor ac(pairs_sim.get()); auto pairs_runtime = pairs_sim->getPairsRuntime(); @@ -44,6 +61,9 @@ int main(int argc, char **argv) { pairs_sim->setInteractionRadius(cell_width); pairs_sim->updateDomain(); + randomaize_indices(ac); + pairs_sim->reneighbor(); + // Inertia update is required for euler updates to be valid (but particles remain stationary) double dt = 0.001; // Arbitrary @@ -89,5 +109,6 @@ int main(int argc, char **argv) { // pairs::vtk_write_data(pairs_runtime, "output/local_spheres", 0, pairs_sim->nlocal(), 0); // pairs::vtk_write_data(pairs_runtime, "output/ghost_spheres", pairs_sim->nlocal(), pairs_sim->size(), 0); + ac.end(); pairs_sim->end(); } \ No newline at end of file diff --git a/examples/benchmarks/sd_static_triangular.cpp b/examples/benchmarks/sd_static_triangular.cpp index 284b8aa..7a05fe5 100644 --- a/examples/benchmarks/sd_static_triangular.cpp +++ b/examples/benchmarks/sd_static_triangular.cpp @@ -4,6 +4,21 @@ #include "spring_dashpot_no_pbc.hpp" +void randomaize_indices(PairsAccessor ac){ + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution<> dist(0, ac.nlocal() - 1); + + ac.syncPosition(PairsAccessor::Host); + for (int i=0; i<ac.nlocal(); ++i){ + int j = dist(gen); + auto tmp = ac.getPosition(i); + ac.setPosition(i, ac.getPosition(j)); + ac.setPosition(j, tmp); + } + ac.syncPosition(PairsAccessor::Host); +} + template<typename Type> void print_global_stats(std::string name, Type value, MPI_Datatype mpi_type, MPI_Comm comm){ int rank, world_size; @@ -60,8 +75,10 @@ int main(int argc, char **argv) { auto pairs_sim = std::make_shared<PairsSimulation>(); pairs_sim->initialize(); + PairsAccessor ac(pairs_sim.get()); + auto pairs_runtime = pairs_sim->getPairsRuntime(); - + bool load_balanced = (std::stoi(argv[5]) != 0); pairs_runtime->initDomain(&argc, &argv, 0, 0, 0, domain_size[0], domain_size[1], domain_size[2], load_balanced); @@ -110,6 +127,9 @@ int main(int argc, char **argv) { // Rebalance pairs_sim->updateDomain(); + randomaize_indices(ac); + pairs_sim->reneighbor(); + // Stats // ------------------------------------------------------------------------------ int rank = pairs_sim->rank(); diff --git a/runtime/pairs.hpp b/runtime/pairs.hpp index 3154099..62ecdd8 100644 --- a/runtime/pairs.hpp +++ b/runtime/pairs.hpp @@ -2,6 +2,7 @@ #include <cmath> #include <memory> #include <vector> +#include <array> //--- #include "allocate.hpp" #include "array.hpp" -- GitLab