From 621bfbebc4c3c9309bf3828efebb8b9e436c622f Mon Sep 17 00:00:00 2001
From: Rafael Ravedutti <rafaelravedutti@gmail.com>
Date: Fri, 1 Dec 2023 15:06:34 +0100
Subject: [PATCH] Use SoA layout for neighbor-lists on GPU

Signed-off-by: Rafael Ravedutti <rafaelravedutti@gmail.com>
---
 examples/lj.py                  | 12 ++++++------
 src/pairs/sim/comm.py           |  4 ++--
 src/pairs/sim/neighbor_lists.py |  8 +++++---
 3 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/examples/lj.py b/examples/lj.py
index 4085490..8f2414d 100644
--- a/examples/lj.py
+++ b/examples/lj.py
@@ -36,6 +36,12 @@ rho = 0.8442
 temp = 1.44
 
 psim = pairs.simulation("lj", [pairs.point_mass()], timesteps=200, double_prec=True)
+
+if target == 'gpu':
+    psim.target(pairs.target_gpu())
+else:
+    psim.target(pairs.target_cpu())
+
 psim.add_position('position')
 psim.add_property('mass', pairs.real(), 1.0)
 psim.add_property('linear_velocity', pairs.vector())
@@ -52,10 +58,4 @@ psim.compute_thermo(100)
 psim.compute(initial_integrate, symbols={'dt': dt}, pre_step=True, skip_first=True)
 psim.compute(lj, cutoff_radius)
 psim.compute(final_integrate, symbols={'dt': dt}, skip_first=True)
-
-if target == 'gpu':
-    psim.target(pairs.target_gpu())
-else:
-    psim.target(pairs.target_cpu())
-
 psim.generate()
diff --git a/src/pairs/sim/comm.py b/src/pairs/sim/comm.py
index e6fc4f6..242c887 100644
--- a/src/pairs/sim/comm.py
+++ b/src/pairs/sim/comm.py
@@ -20,8 +20,8 @@ class Comm:
         self.sim = sim
         self.dom_part = dom_part
         self.nsend_all      = sim.add_var('nsend_all', Types.Int32)
-        self.send_capacity  = sim.add_var('send_capacity', Types.Int32, 200000)
-        self.recv_capacity  = sim.add_var('recv_capacity', Types.Int32, 200000)
+        self.send_capacity  = sim.add_var('send_capacity', Types.Int32, 80000)
+        self.recv_capacity  = sim.add_var('recv_capacity', Types.Int32, 80000)
         self.elem_capacity  = sim.add_var('elem_capacity', Types.Int32, 40)
         self.neigh_capacity = sim.add_var('neigh_capacity', Types.Int32, 10)
         self.nsend          = sim.add_array('nsend', [self.neigh_capacity], Types.Int32)
diff --git a/src/pairs/sim/neighbor_lists.py b/src/pairs/sim/neighbor_lists.py
index 2b10a66..5662522 100644
--- a/src/pairs/sim/neighbor_lists.py
+++ b/src/pairs/sim/neighbor_lists.py
@@ -1,6 +1,7 @@
 from pairs.ir.assign import Assign
 from pairs.ir.block import pairs_device_block
 from pairs.ir.branches import Branch, Filter
+from pairs.ir.layouts import Layouts
 from pairs.ir.loops import ParticleFor
 from pairs.ir.types import Types
 from pairs.ir.utils import Print
@@ -9,10 +10,11 @@ from pairs.sim.lowerable import Lowerable
 
 
 class NeighborLists:
-    def __init__(self, cell_lists):
-        self.sim = cell_lists.sim
+    def __init__(self, sim, cell_lists):
+        neighbor_layout = Layouts.SoA if sim._target.is_gpu() else Layouts.AoS
+        self.sim = sim
         self.cell_lists = cell_lists
-        self.neighborlists = self.sim.add_array('neighborlists', [self.sim.particle_capacity, self.sim.neighbor_capacity], Types.Int32)
+        self.neighborlists = self.sim.add_array('neighborlists', [self.sim.particle_capacity, self.sim.neighbor_capacity], Types.Int32, neighbor_layout)
         self.numneighs = self.sim.add_array('numneighs', [self.sim.particle_capacity, self.sim.max_shapes()], Types.Int32)
 
 
-- 
GitLab