diff --git a/hysop/backend/device/opencl/operator/poisson.py b/hysop/backend/device/opencl/operator/poisson.py index 860efc46d52718026165fe40bfaf244da0d04be7..807f49a0b8091eb8b2ea82700eb3529937bea3ca 100644 --- a/hysop/backend/device/opencl/operator/poisson.py +++ b/hysop/backend/device/opencl/operator/poisson.py @@ -86,6 +86,7 @@ class OpenClPoisson(PoissonOperatorBase, OpenClSymbolic): def setup(self, work): super(OpenClPoisson, self).setup(work) self._build_fft_plans(work) + self._build_ghost_exchanger() def _build_fft_plans(self, work): axes = self.axes @@ -116,6 +117,7 @@ class OpenClPoisson(PoissonOperatorBase, OpenClSymbolic): self.forward_plans = forward_plans self.backward_plans = backward_plans self.fft_buffer = fft_buffer + self.queue = queue def _build_callbacks(self): fp = dtype_to_ctype(self.dtype) @@ -156,6 +158,8 @@ class OpenClPoisson(PoissonOperatorBase, OpenClSymbolic): user_data = self.Kd.data return (forward_callbacks, user_data) + def _build_ghost_exchanger(self): + self._exchange_ghosts = self.dFout.exchange_ghosts(build_launcher=True) @op_apply def apply(self, **kwds): @@ -163,4 +167,4 @@ class OpenClPoisson(PoissonOperatorBase, OpenClSymbolic): for (fp,bp) in zip(self.forward_plans, self.backward_plans): evt, = fp.enqueue() evt, = bp.enqueue() - self.dFout.exchange_ghosts() + evt = self._exchange_ghosts(queue=self.queue) diff --git a/hysop/backend/device/opencl/operator/poisson_rotational.py b/hysop/backend/device/opencl/operator/poisson_rotational.py index e8dc47a83f402a768f9e62b9cf599c8705154cb5..ef9bdf36fe322a37b60aba5e94ea2f6fdc8b56c5 100644 --- a/hysop/backend/device/opencl/operator/poisson_rotational.py +++ b/hysop/backend/device/opencl/operator/poisson_rotational.py @@ -95,6 +95,7 @@ class OpenClPoissonRotational(PoissonRotationalOperatorBase, OpenClSymbolic): def setup(self, work): super(OpenClPoissonRotational, self).setup(work) self._build_fft_plans(work) + self._build_ghost_exchanger() def _build_fft_plans(self, work): axes = self.axes @@ -134,6 +135,7 @@ class OpenClPoissonRotational(PoissonRotationalOperatorBase, OpenClSymbolic): self.forward_plans = forward_plans self.backward_plans = backward_plans self.fft_buffer = fft_buffer + self.queue = queue def _build_forward_callbacks(self, i, in_array_offset): dtype = self.dtype @@ -280,6 +282,8 @@ class OpenClPoissonRotational(PoissonRotationalOperatorBase, OpenClSymbolic): user_data = self.K1d.data return (backward_callbacks, user_data) + def _build_ghost_exchanger(self): + self._exchange_ghosts = self.dW.exchange_ghosts(build_launcher=True) @op_apply def apply(self, **kwds): @@ -290,6 +294,4 @@ class OpenClPoissonRotational(PoissonRotationalOperatorBase, OpenClSymbolic): evt, = fp.enqueue() for bp in self.backward_plans: evt, = bp.enqueue() - evt = self.dW.exchange_ghosts() - if evt: - evt.wait() + evt = self._exchange_ghosts(queue=self.queue) diff --git a/hysop/core/mpi/redistribute.py b/hysop/core/mpi/redistribute.py index ecc1e30186b852cf1ea5e7b9f95c7184e511d514..8208e374ea1c5a937c8392f84fed9cf5547ccd40 100644 --- a/hysop/core/mpi/redistribute.py +++ b/hysop/core/mpi/redistribute.py @@ -53,7 +53,7 @@ def _memcpy(dst, src, target_indices, source_indices): src_slices=source_indices, dst_slices=target_indices) evt = knl(queue=src.default_queue) elif (tkind==Backend.OPENCL): - assert (src.backend is dst.backend) + assert (src.backend.cl_env is dst.backend.cl_env) knl = OpenClCopyBufferRectLauncher.from_slices(varname='redistribute', src=src, dst=dst, src_slices=source_indices, dst_slices=target_indices) evt = knl(queue=src.default_queue) diff --git a/hysop/fields/ghost_exchangers.py b/hysop/fields/ghost_exchangers.py index e0dd169ee8bdadb9eae68af3da37ba8cefc6d988..dd57804e1f636739922e11d27d7240cc1463ca2e 100644 --- a/hysop/fields/ghost_exchangers.py +++ b/hysop/fields/ghost_exchangers.py @@ -176,6 +176,7 @@ class CartesianDiscreteFieldGhostExchanger(GhostExchanger): return tag dim = self.dim + ghosts = self.ghosts ghost_op = self.ghost_op comm = self.topology.comm local_rank = self.topology.cart_rank @@ -195,19 +196,20 @@ class CartesianDiscreteFieldGhostExchanger(GhostExchanger): lp.w_send_requests = {} lp.w_recv_requests = {} - if ghost_op is GhostOperation.EXCHANGE: + if (ghost_op is GhostOperation.EXCHANGE) and (dim>1): # set all outer diagonal ghosts to NAN for directions in all_outer_ghost_slices[dim]: - for displacements in all_outer_ghost_slices[dim][directions]: - ndisplacements = sum(d!=0 for d in displacements) - if (ndisplacements != dim): - continue - slc, shape = all_outer_ghost_slices[dim][directions][displacements] - value = default_invalid_value(dtype=base_dtype) - lp.diagonal_ghosts.append((buf,slc,shape,value)) + if all(ghosts[d]>0 for d in directions): + for displacements in all_outer_ghost_slices[dim][directions]: + ndisplacements = sum(d!=0 for d in displacements) + if (ndisplacements != dim): + continue + slc, shape = all_outer_ghost_slices[dim][directions][displacements] + value = default_invalid_value(dtype=base_dtype) + lp.diagonal_ghosts.append((buf,slc,shape,value)) for d in self.directions: - if self.ghosts[d]==0: + if ghosts[d]==0: continue inner_left, inner_right, shape = self.inner_ghosts[d] outer_left, outer_right, shape = self.outer_ghosts[d]