From 59d79191b08c12d30b4f75a1704dc4e65c9e3337 Mon Sep 17 00:00:00 2001 From: Fabio Luporini Date: Thu, 6 Nov 2025 17:28:10 +0000 Subject: [PATCH 1/2] compiler: Tweak fission-for-parallelism --- devito/ir/clusters/algorithms.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/devito/ir/clusters/algorithms.py b/devito/ir/clusters/algorithms.py index 979d13ee8f..066cd029b3 100644 --- a/devito/ir/clusters/algorithms.py +++ b/devito/ir/clusters/algorithms.py @@ -156,9 +156,10 @@ def callback(self, clusters, prefix, backlog=None, known_break=None): # Schedule Clusters over different IterationSpaces if this increases # parallelism - for i in range(1, len(clusters)): + for i in reversed(range(len(clusters) - 1)): if self._break_for_parallelism(scope, candidates, i): - return self.callback(clusters[:i], prefix, clusters[i:] + backlog, + return self.callback(clusters[:i+1], prefix, + clusters[i+1:] + backlog, candidates | known_break) # Compute iteration direction From bc2281ce2637a094dc06a798d0facc4645f7e2c2 Mon Sep 17 00:00:00 2001 From: Fabio Luporini Date: Fri, 14 Nov 2025 08:10:44 +0000 Subject: [PATCH 2/2] compiler: Improve loop fission --- tests/test_fission.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/tests/test_fission.py b/tests/test_fission.py index 9f7c74b6a6..bf3651ede1 100644 --- a/tests/test_fission.py +++ b/tests/test_fission.py @@ -2,7 +2,7 @@ from conftest import assert_structure from devito import (Eq, Inc, Grid, Function, TimeFunction, SubDimension, SubDomain, - Operator, solve) + Operator, VectorTimeFunction, Buffer, curl, solve) def test_issue_1725(): @@ -125,3 +125,21 @@ def test_issue_1921(): op1.apply(time_m=1, time_M=5, g=g1) assert np.all(g.data == g1.data) + + +def test_fission_largest_cluster(): + grid = Grid(shape=(10, 10, 10)) + x, y, z = grid.dimensions + + A = VectorTimeFunction(name='A', grid=grid, save=Buffer(1), space_order=2, + time_order=1, staggered=(x, y, z)) + B = VectorTimeFunction(name='B', grid=grid, save=Buffer(1), space_order=2, + time_order=1, staggered=((y, z), (x, z), (x, y))) + f = Function(name='f', grid=grid, space_order=2) + + eqs = [Eq(B.forward, solve(Eq(curl(A), -B.dt), B.forward)), + Eq(A.forward, solve(Eq(curl(B.forward), f*A.dt), A.forward))] + + op = Operator(eqs, opt='fission') + + assert_structure(op, ['t,x,y,z', 't,x,y,z'], 't,x,y,z,x,y,z')