From 2d2fcea8181c606e131341ca1cf93ff707689378 Mon Sep 17 00:00:00 2001 From: Oliver Zier <ozier@web.de> Date: Thu, 8 Oct 2020 21:29:02 +0200 Subject: [PATCH] Fix init_entropy by adding synchronization --- src/pm/pm_periodic.cc | 1 - src/sph/init_entropy.cc | 34 +++++++++++++++++++++++++++------- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/pm/pm_periodic.cc b/src/pm/pm_periodic.cc index 1eee5b5..7667d94 100644 --- a/src/pm/pm_periodic.cc +++ b/src/pm/pm_periodic.cc @@ -253,7 +253,6 @@ void pm_periodic::pmforce_zoom_optimized_prepare_density(int mode, int *typelist large_numpart_type num_on_grid = ((large_numpart_type)NSource) << 3; /* bring the part-field into the order of the accessed cells. This allows the removal of duplicates */ - // mycxxsort(part_sortindex, part_sortindex + num_on_grid, pm_periodic_compare_sortindex, part); mycxxsort(part_sortindex, part_sortindex + num_on_grid, pm_periodic_sortindex_comparator(part)); diff --git a/src/sph/init_entropy.cc b/src/sph/init_entropy.cc index 231eeb4..7ef8c71 100644 --- a/src/sph/init_entropy.cc +++ b/src/sph/init_entropy.cc @@ -78,21 +78,41 @@ void sph::init_entropy(void) Foreign_Points = (foreign_sphpoint_data *)Mem.mymalloc_movable(&Foreign_Points, "Foreign_Points", MaxForeignPoints * sizeof(foreign_sphpoint_data)); - tree_initialize_leaf_node_access_info(); - max_ncycles = 0; - - prepare_shared_memory_access(); double tstart = Logs.second(); + int global_left_particles = 0; + + MPI_Allreduce(&ndensities, &global_left_particles, 1, MPI_INT, MPI_SUM, D->Communicator); + do { double t0 = Logs.second(); + /* Since EntropyToInvGammaPred of remote particles can change, we have to import the particles in every iteration */ + + MaxForeignNodes = nspace; + MaxForeignPoints = 8 * nspace; + NumForeignNodes = 0; + NumForeignPoints = 0; + + sum_NumForeignNodes = 0; + sum_NumForeignPoints = 0; + + tree_initialize_leaf_node_access_info(); + + max_ncycles = 0; + + prepare_shared_memory_access(); + /* now do the primary work with this call */ densities_determine(ndensities, targetList); + MPI_Allreduce(MPI_IN_PLACE, &max_ncycles, 1, MPI_INT, MPI_MAX, D->Communicator); + + cleanup_shared_memory_access(); + /* do final operations on results */ double entropy_old; @@ -132,6 +152,8 @@ void sph::init_entropy(void) ndensities = npleft; + MPI_Allreduce(&ndensities, &global_left_particles, 1, MPI_INT, MPI_SUM, D->Communicator); + double t1 = Logs.second(); if(npleft > 0) @@ -147,13 +169,11 @@ void sph::init_entropy(void) else D->mpi_printf("SPH-INIT-ENTROPY: ngb iteration %4d: took %8.3f\n", ++iter, Logs.timediff(t0, t1)); } - while(ndensities > 0); + while(global_left_particles > 0); - MPI_Allreduce(MPI_IN_PLACE, &max_ncycles, 1, MPI_INT, MPI_MAX, D->Communicator); TIMER_STOP(CPU_DENSITY); - cleanup_shared_memory_access(); /* free temporary buffers */ -- GitLab