From 422a2494c1ae20f1d28f8cd8e2a52faf67e75c1f Mon Sep 17 00:00:00 2001 From: Frederik Hennig <frederik.hennig@fau.de> Date: Wed, 19 Feb 2025 10:27:40 +0100 Subject: [PATCH] add dry-dock tests for SYCL codegen --- src/pystencils/codegen/driver.py | 25 ++++++------- tests/kernelcreation/test_sycl_codegen.py | 45 +++++++++++++++++++++++ 2 files changed, 57 insertions(+), 13 deletions(-) create mode 100644 tests/kernelcreation/test_sycl_codegen.py diff --git a/src/pystencils/codegen/driver.py b/src/pystencils/codegen/driver.py index eaac393ef..b8f9c7101 100644 --- a/src/pystencils/codegen/driver.py +++ b/src/pystencils/codegen/driver.py @@ -436,23 +436,11 @@ class DefaultKernelCreationDriver: f"No platform is currently available for CPU target {self._target}" ) - elif Target._GPU in self._target: + elif self._target.is_gpu(): gpu_opts = self._cfg.gpu omit_range_check: bool = gpu_opts.get_option("omit_range_check") match self._target: - case Target.SYCL: - from ..backend.platforms import SyclPlatform - - auto_block_size: bool = self._cfg.sycl.get_option( - "automatic_block_size" - ) - - return SyclPlatform( - self._ctx, - omit_range_check=omit_range_check, - automatic_block_size=auto_block_size, - ) case Target.CUDA: from ..backend.platforms import CudaPlatform @@ -467,6 +455,17 @@ class DefaultKernelCreationDriver: omit_range_check=omit_range_check, thread_mapping=thread_mapping, ) + elif self._target == Target.SYCL: + from ..backend.platforms import SyclPlatform + + auto_block_size: bool = self._cfg.sycl.get_option("automatic_block_size") + omit_range_check = self._cfg.gpu.get_option("omit_range_check") + + return SyclPlatform( + self._ctx, + omit_range_check=omit_range_check, + automatic_block_size=auto_block_size, + ) raise NotImplementedError( f"Code generation for target {self._target} not implemented" diff --git a/tests/kernelcreation/test_sycl_codegen.py b/tests/kernelcreation/test_sycl_codegen.py new file mode 100644 index 000000000..b6907c996 --- /dev/null +++ b/tests/kernelcreation/test_sycl_codegen.py @@ -0,0 +1,45 @@ +""" +Since we don't have a JIT compiler for SYCL, these tests can only +perform dry-dock testing. +If the SYCL target should ever become non-experimental, we need to +find a way to properly test SYCL kernels in execution. + +These tests primarily check that the code generation driver runs +successfully for the SYCL target. +""" + +import sympy as sp +from pystencils import ( + create_kernel, + Target, + fields, + Assignment, + CreateKernelConfig, +) + + +def test_sycl_kernel_static(): + src, dst = fields("src, dst: [2D]") + asm = Assignment(dst.center(), sp.sin(src.center()) + sp.cos(src.center())) + + cfg = CreateKernelConfig(target=Target.SYCL) + kernel = create_kernel(asm, cfg) + + code_string = kernel.get_c_code() + + assert "sycl::id< 2 >" in code_string + assert "sycl::sin(" in code_string + assert "sycl::cos(" in code_string + + +def test_sycl_kernel_manual_block_size(): + src, dst = fields("src, dst: [2D]") + asm = Assignment(dst.center(), sp.sin(src.center()) + sp.cos(src.center())) + + cfg = CreateKernelConfig(target=Target.SYCL) + cfg.sycl.automatic_block_size = False + kernel = create_kernel(asm, cfg) + + code_string = kernel.get_c_code() + + assert "sycl::nd_item< 2 >" in code_string -- GitLab