From 53f53d5ca4b787c25258ada7be6022a1a3588e9d Mon Sep 17 00:00:00 2001 From: Edward Caunt Date: Wed, 27 May 2026 17:01:43 +0100 Subject: [PATCH 1/3] compiler: Start work on hook for operator lookup --- devito/operator/operator.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/devito/operator/operator.py b/devito/operator/operator.py index a57ce5bd04..96a03d0a0a 100644 --- a/devito/operator/operator.py +++ b/devito/operator/operator.py @@ -182,6 +182,12 @@ def __new__(cls, expressions, **kwargs): cls._check_kwargs(**kwargs) expressions = cls._sanitize_exprs(expressions, **kwargs) + # Hook for retrieval of preexisting operators + # TODO: should this emit timing info if an operator is retrieved + maybe_op = cls._retrieve_op(expressions, **kwargs) + if maybe_op: + return maybe_op + # Lower to a JIT-compilable object with timed_region('op-compile') as r: try: @@ -215,6 +221,10 @@ def _sanitize_exprs(cls, expressions, **kwargs): return expressions + @classmethod + def _retrieve_opt(cls, expressions, **kwargs): + return + @classmethod def _build(cls, expressions, **kwargs): # Python- (i.e., compile-) and C-level (i.e., run-time) performance From 86d0d3617808712579e3c0ae607a0c8c29c6b96d Mon Sep 17 00:00:00 2001 From: Edward Caunt Date: Tue, 16 Jun 2026 15:16:53 +0000 Subject: [PATCH 2/3] misc: Minor enhancement to Eq printing --- devito/operator/operator.py | 2 +- devito/types/equation.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/devito/operator/operator.py b/devito/operator/operator.py index 96a03d0a0a..55f3cf8d55 100644 --- a/devito/operator/operator.py +++ b/devito/operator/operator.py @@ -222,7 +222,7 @@ def _sanitize_exprs(cls, expressions, **kwargs): return expressions @classmethod - def _retrieve_opt(cls, expressions, **kwargs): + def _retrieve_op(cls, expressions, **kwargs): return @classmethod diff --git a/devito/types/equation.py b/devito/types/equation.py index 5b709ee89e..dee06de61b 100644 --- a/devito/types/equation.py +++ b/devito/types/equation.py @@ -183,6 +183,9 @@ def xreplace(self, rules): return self.func(self.lhs.xreplace(rules), self.rhs.xreplace(rules)) def __str__(self): + if self._subdomain is not None: + return (f"{self.__class__.__name__}({self.lhs}, {self.rhs}," + f" subdomain={self._subdomain})") return f"{self.__class__.__name__}({self.lhs}, {self.rhs})" __repr__ = __str__ From 6bdc1808f9c9f125a53cbc41836e7f29d547307b Mon Sep 17 00:00:00 2001 From: Edward Caunt Date: Mon, 29 Jun 2026 16:12:26 +0100 Subject: [PATCH 3/3] compiler: Move platform digest --- devito/arch/archinfo.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/devito/arch/archinfo.py b/devito/arch/archinfo.py index 0eb1bed0fa..9f40630651 100644 --- a/devito/arch/archinfo.py +++ b/devito/arch/archinfo.py @@ -16,7 +16,7 @@ from packaging.version import InvalidVersion, parse from devito.logger import warning -from devito.tools import all_equal, as_tuple, memoized_func +from devito.tools import all_equal, as_tuple, frozendict, memoized_func __all__ = [ # noqa: RUF022 'platform_registry', 'get_cpu_info', 'get_gpu_info', 'get_visible_devices', @@ -855,6 +855,13 @@ def supports(self, query, language=None): """ return False + @cached_property + def digest(self): + fields = ('brand', 'logical', 'physical') + cpuinfo = get_cpu_info() + # TODO: Is it necessary to homogenise brand info? + return frozendict({k: cpuinfo[k] for k in fields}) + class Cpu64(Platform): @@ -1093,6 +1100,15 @@ def limits(self, compiler=None, language=None): 'max-block-dims': 3, } + @cached_property + def digest(self): + fields = ('architecture', 'product', 'vendor') + gpuinfo = get_gpu_info() + mapper = {k: gpuinfo[k] for k in fields} + mapper['mem.total'] = gpuinfo['mem.total']() + + return frozendict(mapper) + class IntelDevice(Device):