diff --git a/src/pystencils/backend/kernelcreation/__init__.py b/src/pystencils/backend/kernelcreation/__init__.py index 978616769d4c534d05ea4a66cca654e3db06d134..1cbddab4f9dea32a30b95f211db935a542840bbe 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 0000000000000000000000000000000000000000..47db578232578ef9fbf48cb8b34fde8e549ab00e --- /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 0d1e34639d5dac3d33b211e652f7bb85c127ec32..2e571111f41c3ec1826df90fb88e96be735d6c4a 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 8c53a9f166f44118f942c795b5b21bf9f2464112..08e87ed82e014434e8febbb2de912f09ab8b6ed1 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 7b42c48903c94b6d6971b22cd15beba377c73e25..fe5e1c76db8e106bb99324599b79e0e8d43c4da8 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 fc261f17485ba76a8b955168548d07df5790ba4c..b4c0e8bbd32fe738b29828ac16a4bdd1401e4fae 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 b2fe4b664fe391b98bd222147c2bf92e274735a3..79cf92f8bf882749ade1afd0c8c686cdfb21d5a0 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(