From e6f464aa1acaa9c5d05b117923c87a50bfda1bda Mon Sep 17 00:00:00 2001
From: Frederik Hennig <frederik.hennig@fau.de>
Date: Fri, 15 Mar 2024 10:40:07 +0100
Subject: [PATCH] add empty cpu optimization driver. refactor intrinsic
 selection module.

---
 .../backend/kernelcreation/__init__.py        |  3 ++
 .../kernelcreation/cpu_optimization.py        | 28 +++++++++++++++++++
 .../backend/kernelcreation/freeze.py          | 16 -----------
 .../backend/platforms/generic_cpu.py          |  2 +-
 src/pystencils/backend/platforms/x86.py       |  2 +-
 .../backend/transformations/__init__.py       |  2 +-
 ...tor_intrinsics.py => select_intrinsics.py} |  0
 src/pystencils/kernelcreation.py              |  8 +++---
 8 files changed, 38 insertions(+), 23 deletions(-)
 create mode 100644 src/pystencils/backend/kernelcreation/cpu_optimization.py
 rename src/pystencils/backend/transformations/{vector_intrinsics.py => select_intrinsics.py} (100%)

diff --git a/src/pystencils/backend/kernelcreation/__init__.py b/src/pystencils/backend/kernelcreation/__init__.py
index 978616769..1cbddab4f 100644
--- a/src/pystencils/backend/kernelcreation/__init__.py
+++ b/src/pystencils/backend/kernelcreation/__init__.py
@@ -10,6 +10,8 @@ from .iteration_space import (
     create_sparse_iteration_space,
 )
 
+from .cpu_optimization import optimize_cpu
+
 __all__ = [
     "KernelCreationContext",
     "KernelAnalysis",
@@ -19,4 +21,5 @@ __all__ = [
     "SparseIterationSpace",
     "create_full_iteration_space",
     "create_sparse_iteration_space",
+    "optimize_cpu",
 ]
diff --git a/src/pystencils/backend/kernelcreation/cpu_optimization.py b/src/pystencils/backend/kernelcreation/cpu_optimization.py
new file mode 100644
index 000000000..47db57823
--- /dev/null
+++ b/src/pystencils/backend/kernelcreation/cpu_optimization.py
@@ -0,0 +1,28 @@
+from __future__ import annotations
+
+from .context import KernelCreationContext
+from ..platforms import GenericCpu
+from ..ast.structural import PsBlock
+
+from ...config import CpuOptimConfig
+
+
+def optimize_cpu(
+    ctx: KernelCreationContext,
+    platform: GenericCpu,
+    kernel_ast: PsBlock,
+    cfg: CpuOptimConfig,
+):
+    """Carry out CPU-specific optimizations according to the given configuration."""
+
+    if cfg.loop_blocking:
+        raise NotImplementedError("Loop blocking not implemented yet.")
+
+    if cfg.vectorize is not False:
+        raise NotImplementedError("Vectorization not implemented yet")
+
+    if cfg.openmp:
+        raise NotImplementedError("OpenMP not implemented yet")
+
+    if cfg.use_cacheline_zeroing:
+        raise NotImplementedError("CL-zeroing not implemented yet")
diff --git a/src/pystencils/backend/kernelcreation/freeze.py b/src/pystencils/backend/kernelcreation/freeze.py
index 0d1e34639..2e571111f 100644
--- a/src/pystencils/backend/kernelcreation/freeze.py
+++ b/src/pystencils/backend/kernelcreation/freeze.py
@@ -48,22 +48,6 @@ class FreezeExpressions:
 
     TODO: Document the full set of supported SymPy features, with restrictions and caveats
     TODO: Properly document the SymPy extensions provided by pystencils
-
-    TODO: This is a (possibly incomplete) list of SymPy language features that still need to be implemented:
-
-     - Augmented Assignments
-     - AddressOf
-     - Relations (sp.Relational)
-     - pystencils.sympyextensions.integer_functions
-     - pystencils.sympyextensions.bit_masks
-     - GPU fast approximations (pystencils.fast_approximation)
-     - ConditionalFieldAccess
-     - sp.Piecewise
-     - sp.floor, sp.ceiling
-     - sp.log, sp.atan2, sp.sinh, sp.cosh. sp.atan
-     - sp.Min, sp.Max: multi-argument versions
-     - Modulus (sp.Mod)
-
     """
 
     def __init__(self, ctx: KernelCreationContext):
diff --git a/src/pystencils/backend/platforms/generic_cpu.py b/src/pystencils/backend/platforms/generic_cpu.py
index 8c53a9f16..08e87ed82 100644
--- a/src/pystencils/backend/platforms/generic_cpu.py
+++ b/src/pystencils/backend/platforms/generic_cpu.py
@@ -19,7 +19,7 @@ from ..ast.expressions import (
     PsLookup,
 )
 from ...types import PsVectorType, PsCustomType
-from ..transformations.vector_intrinsics import IntrinsicOps
+from ..transformations.select_intrinsics import IntrinsicOps
 
 
 class GenericCpu(Platform):
diff --git a/src/pystencils/backend/platforms/x86.py b/src/pystencils/backend/platforms/x86.py
index 7b42c4890..fe5e1c76d 100644
--- a/src/pystencils/backend/platforms/x86.py
+++ b/src/pystencils/backend/platforms/x86.py
@@ -9,7 +9,7 @@ from ..ast.expressions import (
     PsAddressOf,
     PsSubscript,
 )
-from ..transformations.vector_intrinsics import IntrinsicOps
+from ..transformations.select_intrinsics import IntrinsicOps
 from ...types import PsCustomType, PsVectorType
 from ..constants import PsConstant
 
diff --git a/src/pystencils/backend/transformations/__init__.py b/src/pystencils/backend/transformations/__init__.py
index fc261f174..b4c0e8bbd 100644
--- a/src/pystencils/backend/transformations/__init__.py
+++ b/src/pystencils/backend/transformations/__init__.py
@@ -1,6 +1,6 @@
 from .eliminate_constants import EliminateConstants
 from .erase_anonymous_structs import EraseAnonymousStructTypes
-from .vector_intrinsics import MaterializeVectorIntrinsics
+from .select_intrinsics import MaterializeVectorIntrinsics
 
 __all__ = [
     "EliminateConstants",
diff --git a/src/pystencils/backend/transformations/vector_intrinsics.py b/src/pystencils/backend/transformations/select_intrinsics.py
similarity index 100%
rename from src/pystencils/backend/transformations/vector_intrinsics.py
rename to src/pystencils/backend/transformations/select_intrinsics.py
diff --git a/src/pystencils/kernelcreation.py b/src/pystencils/kernelcreation.py
index b2fe4b664..79cf92f8b 100644
--- a/src/pystencils/kernelcreation.py
+++ b/src/pystencils/kernelcreation.py
@@ -99,10 +99,10 @@ def create_kernel(
     erase_anons = EraseAnonymousStructTypes(ctx)
     kernel_ast = cast(PsBlock, erase_anons(kernel_ast))
 
-    #   7. Apply optimizations
-    #     - Vectorization
-    #     - OpenMP
-    #     - Loop Splitting, Tiling, Blocking
+    #   Target-Specific optimizations
+    if config.target.is_cpu() and config.cpu_optim is not None:
+        from .backend.kernelcreation import optimize_cpu
+        optimize_cpu(ctx, platform, kernel_ast, config.cpu_optim)
 
     assert config.jit is not None
     return create_kernel_function(
-- 
GitLab