From a766964957f1d7ac9e1963fe963fb8b929059085 Mon Sep 17 00:00:00 2001 From: Behzad Safaei <iwia103h@a0229.nhr.fau.de> Date: Wed, 19 Mar 2025 20:00:23 +0100 Subject: [PATCH] Fix issue with array reallocations for load balancing --- src/pairs/sim/comm.py | 20 +++++++------ src/pairs/sim/domain_partitioning.py | 43 ++++++++++++++++------------ 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/pairs/sim/comm.py b/src/pairs/sim/comm.py index 30ca8e9..10f78d4 100644 --- a/src/pairs/sim/comm.py +++ b/src/pairs/sim/comm.py @@ -36,10 +36,12 @@ class Comm: self.recv_buffer = sim.add_array('recv_buffer', [self.recv_capacity, self.elem_capacity], Types.Real, arr_sync=False) self.recv_map = sim.add_array('recv_map', [self.recv_capacity], Types.Int32) self.recv_mult = sim.add_array('recv_mult', [self.recv_capacity, sim.ndims()], Types.Int32) - self.nsend_contact = sim.add_array('nsend_contact', [dom_part.nranks_capacity], Types.Int32) - self.nrecv_contact = sim.add_array('nrecv_contact', [dom_part.nranks_capacity], Types.Int32) - self.contact_soffsets = sim.add_array('contact_soffsets', [dom_part.nranks_capacity], Types.Int32) - self.contact_roffsets = sim.add_array('contact_roffsets', [dom_part.nranks_capacity], Types.Int32) + + if self.sim._use_contact_history: + self.nsend_contact = sim.add_array('nsend_contact', [dom_part.nranks_capacity], Types.Int32) + self.nrecv_contact = sim.add_array('nrecv_contact', [dom_part.nranks_capacity], Types.Int32) + self.contact_soffsets = sim.add_array('contact_soffsets', [dom_part.nranks_capacity], Types.Int32) + self.contact_roffsets = sim.add_array('contact_roffsets', [dom_part.nranks_capacity], Types.Int32) if self.sim.properties.reduction_props(): self.nsend_reverse = sim.add_array('nsend_reverse', [dom_part.nranks_capacity], Types.Int32) @@ -138,10 +140,12 @@ class Exchange(Lowerable): Assign(self.comm.sim, self.comm.nrecv[j], 0) Assign(self.comm.sim, self.comm.send_offsets[j], 0) Assign(self.comm.sim, self.comm.recv_offsets[j], 0) - Assign(self.comm.sim, self.comm.nsend_contact[j], 0) - Assign(self.comm.sim, self.comm.nrecv_contact[j], 0) - Assign(self.comm.sim, self.comm.contact_soffsets[j], 0) - Assign(self.comm.sim, self.comm.contact_soffsets[j], 0) + + if self.sim._use_contact_history: + Assign(self.comm.sim, self.comm.nsend_contact[j], 0) + Assign(self.comm.sim, self.comm.nrecv_contact[j], 0) + Assign(self.comm.sim, self.comm.contact_soffsets[j], 0) + Assign(self.comm.sim, self.comm.contact_soffsets[j], 0) if self.sim._target.is_gpu(): CopyArray(self.comm.sim, self.comm.nsend, Contexts.Device, Actions.Ignore) diff --git a/src/pairs/sim/domain_partitioning.py b/src/pairs/sim/domain_partitioning.py index fc5b87b..0229e19 100644 --- a/src/pairs/sim/domain_partitioning.py +++ b/src/pairs/sim/domain_partitioning.py @@ -199,26 +199,31 @@ class BlockForest: Assign(self.sim, self.nranks, Call_Int(self.sim, "pairs_runtime->getNumberOfNeighborRanks", [])) Assign(self.sim, self.ntotal_aabbs, Call_Int(self.sim, "pairs_runtime->getNumberOfNeighborAABBs", [])) - for _ in Filter(self.sim, self.nranks_capacity < self.nranks): - Assign(self.sim, self.nranks_capacity, self.nranks + 10) - self.ranks.realloc() - self.naabbs.realloc() - self.aabb_offsets.realloc() - - for _ in Filter(self.sim, self.aabb_capacity < self.ntotal_aabbs): - Assign(self.sim, self.aabb_capacity, self.ntotal_aabbs + 20) - self.aabbs.realloc() + for _ in Filter(self.sim, ScalarOp.neq(self.nranks, 0)): + for _ in Filter(self.sim, self.nranks_capacity < self.nranks): + Assign(self.sim, self.nranks_capacity, self.nranks + 10) + for arr in self.nranks_capacity.bonded_arrays(): + arr.realloc() + + for _ in Filter(self.sim, self.aabb_capacity < self.ntotal_aabbs): + Assign(self.sim, self.aabb_capacity, self.ntotal_aabbs + 20) + for arr in self.aabb_capacity.bonded_arrays(): + arr.realloc() + + if self.sim._target.is_gpu(): + CopyArray(self.sim, self.ranks, Contexts.Host, Actions.WriteOnly, self.nranks) + CopyArray(self.sim, self.naabbs, Contexts.Host, Actions.WriteOnly, self.nranks) + CopyArray(self.sim, self.aabb_offsets, Contexts.Host, Actions.WriteOnly, self.nranks) + CopyArray(self.sim, self.aabbs, Contexts.Host, Actions.WriteOnly, self.ntotal_aabbs * 6) + + Call_Void(self.sim, "pairs_runtime->copyRuntimeArray", ['ranks', self.ranks, self.nranks]) + Call_Void(self.sim, "pairs_runtime->copyRuntimeArray", ['naabbs', self.naabbs, self.nranks]) + Call_Void(self.sim, "pairs_runtime->copyRuntimeArray", ['aabb_offsets', self.aabb_offsets, self.nranks]) + Call_Void(self.sim, "pairs_runtime->copyRuntimeArray", ['aabbs', self.aabbs, self.ntotal_aabbs * 6]) - CopyArray(self.sim, self.ranks, Contexts.Host, Actions.WriteOnly, self.nranks) - CopyArray(self.sim, self.naabbs, Contexts.Host, Actions.WriteOnly, self.nranks) - CopyArray(self.sim, self.aabb_offsets, Contexts.Host, Actions.WriteOnly, self.nranks) - CopyArray(self.sim, self.aabbs, Contexts.Host, Actions.WriteOnly, self.ntotal_aabbs * 6) - CopyArray(self.sim, self.subdom, Contexts.Host, Actions.WriteOnly) - - Call_Void(self.sim, "pairs_runtime->copyRuntimeArray", ['ranks', self.ranks, self.nranks]) - Call_Void(self.sim, "pairs_runtime->copyRuntimeArray", ['naabbs', self.naabbs, self.nranks]) - Call_Void(self.sim, "pairs_runtime->copyRuntimeArray", ['aabb_offsets', self.aabb_offsets, self.nranks]) - Call_Void(self.sim, "pairs_runtime->copyRuntimeArray", ['aabbs', self.aabbs, self.ntotal_aabbs * 6]) + if self.sim._target.is_gpu(): + CopyArray(self.sim, self.subdom, Contexts.Host, Actions.WriteOnly) + Call_Void(self.sim, "pairs_runtime->copyRuntimeArray", ['subdom', self.subdom, self.sim.ndims() * 2]) if isinstance(self.sim.grid, MutableGrid): -- GitLab