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