From ba044dbf3a892ef7b427635c6347abca1dc6c707 Mon Sep 17 00:00:00 2001
From: Frederik Hennig <frederik.hennig@fau.de>
Date: Thu, 16 May 2024 17:32:11 +0200
Subject: [PATCH] add OpenMP insertion to optimize_cpu

---
 .../backend/kernelcreation/cpu_optimization.py       | 12 +++++++-----
 src/pystencils/config.py                             |  6 +++---
 2 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/src/pystencils/backend/kernelcreation/cpu_optimization.py b/src/pystencils/backend/kernelcreation/cpu_optimization.py
index 0e3308cfc..d8d761aec 100644
--- a/src/pystencils/backend/kernelcreation/cpu_optimization.py
+++ b/src/pystencils/backend/kernelcreation/cpu_optimization.py
@@ -1,12 +1,11 @@
 from __future__ import annotations
-from typing import cast, TYPE_CHECKING
+from typing import cast
 
 from .context import KernelCreationContext
 from ..platforms import GenericCpu
 from ..ast.structural import PsBlock
 
-if TYPE_CHECKING:
-    from ...config import CpuOptimConfig
+from ...config import CpuOptimConfig, OpenMpParams
 
 
 def optimize_cpu(
@@ -33,8 +32,11 @@ def optimize_cpu(
     if cfg.vectorize is not False:
         raise NotImplementedError("Vectorization not implemented yet")
 
-    if cfg.openmp:
-        pass
+    if cfg.openmp is not False:
+        from ..transformations import AddOpenMP
+        params = cfg.openmp if isinstance(cfg.openmp, OpenMpParams) else OpenMpParams()
+        add_omp = AddOpenMP(ctx, params)
+        kernel_ast = cast(PsBlock, add_omp(kernel_ast))
 
     if cfg.use_cacheline_zeroing:
         raise NotImplementedError("CL-zeroing not implemented yet")
diff --git a/src/pystencils/config.py b/src/pystencils/config.py
index eaf5e635c..0fc71d666 100644
--- a/src/pystencils/config.py
+++ b/src/pystencils/config.py
@@ -58,11 +58,11 @@ class CpuOptimConfig:
     in `CreateKernelConfig.target`, an error will be raised.
     """
     
-    openmp: bool = False
+    openmp: bool | OpenMpParams = False
     """Enable OpenMP parallelization.
     
-    If set to `True`, the kernel will be parallelized using OpenMP according to the OpenMP settings
-    given in this configuration.
+    If set to `True`, the kernel will be parallelized using OpenMP according to the default settings in `OpenMpParams`.
+    To customize OpenMP parallelization, pass an instance of `OpenMpParams` instead.
     """
 
     vectorize: bool | VectorizationConfig = False
-- 
GitLab