From 0598f755d0ad46778cea176c0d15f4eb68107382 Mon Sep 17 00:00:00 2001 From: "Larsen, Steffen" Date: Mon, 22 Jul 2024 06:06:44 -0700 Subject: [PATCH 1/3] [SYCL][Docs] Add kernel enqueue functions for kernel and properties The current version of the (sycl_ext_oneapi_kernel_properties)[https://github.com/intel/llvm/blob/sycl/sycl/doc/extensions/experimental/sycl_ext_oneapi_kernel_properties.asciidoc] extension does not have overloads for `single_task` and `parallel_for` that takes a `sycl::kernel` argument. This was likely omitted as all the properties added by the extension had direct effects on how the compiler would handle the kernel code, which cannot be done when the kernel argument is a `sycl::kernel` object. However, as more kernel property extension are written, some of them affect how the runtime handles the launch of kernels and could as such be applied to such kernel enqueue functions. This commit adds member function overloads to `sycl::handler` for `single_task` and `parallel_for` that takes a `sycl::kernel` argument in the (sycl_ext_oneapi_kernel_properties)[https://github.com/intel/llvm/blob/sycl/sycl/doc/extensions/experimental/sycl_ext_oneapi_kernel_properties.asciidoc] extension. Likewise, these new overloads are added to the implementation of `sycl::handler`. Signed-off-by: Larsen, Steffen --- ...sycl_ext_oneapi_kernel_properties.asciidoc | 57 +++++- ..._fpga_kernel_interface_properties.asciidoc | 23 ++- .../include/sycl/detail/kernel_properties.hpp | 1 + .../experimental/fpga_kernel_properties.hpp | 9 + .../oneapi/kernel_properties/properties.hpp | 13 ++ .../sycl/ext/oneapi/properties/property.hpp | 5 + sycl/include/sycl/handler.hpp | 187 ++++++++++++++---- .../properties/kernel_properties_negative.cpp | 99 ++++++++++ .../properties/properties_kernel.cpp | 9 + .../properties/properties_kernel_fpga.cpp | 11 ++ sycl/unittests/Extensions/CMakeLists.txt | 1 + .../unittests/Extensions/KernelProperties.cpp | 140 +++++++++++++ 12 files changed, 499 insertions(+), 56 deletions(-) create mode 100644 sycl/test/extensions/properties/kernel_properties_negative.cpp create mode 100644 sycl/unittests/Extensions/KernelProperties.cpp diff --git a/sycl/doc/extensions/experimental/sycl_ext_oneapi_kernel_properties.asciidoc b/sycl/doc/extensions/experimental/sycl_ext_oneapi_kernel_properties.asciidoc index 878f0862ac990..c03b86cc18eb7 100644 --- a/sycl/doc/extensions/experimental/sycl_ext_oneapi_kernel_properties.asciidoc +++ b/sycl/doc/extensions/experimental/sycl_ext_oneapi_kernel_properties.asciidoc @@ -114,6 +114,27 @@ supports. feature-test macro always has this value. |=== +=== Kernel Property Trait + +Some kernel properties carry compile-time information to affect how the compiler +handles the corresponding kernel object. However, some of the kernel enqueue +functions take a `sycl::kernel` object and as such it may not be possible to +infer which kernel function it refers to at compile-time. To help identify the +properties that have compile-time effects on the kernel, the +`has_compile_time_kernel_effect` trait. + +```c++ +namespace sycl::ext::oneapi::experimental { + +template struct has_compile_time_kernel_effect : std::false_type {}; + +template +static constexpr bool has_compile_time_kernel_effect_v = + has_compile_time_kernel_effect::value; + +} // namespace sycl::ext::oneapi::experimental +``` + === Kernel Properties The kernel properties below correspond to kernel attributes defined in @@ -121,10 +142,7 @@ Section 5.8.1 of the SYCL 2020 specification. Note that deprecated attributes (such as `vec_type_hint`) are not included. ```c++ -namespace sycl { -namespace ext { -namespace oneapi { -namespace experimental { +namespace sycl::ext::oneapi::experimental { // Corresponds to reqd_work_group_size struct work_group_size_key { @@ -185,10 +203,16 @@ template <> struct is_property_key : std::true_type {} template <> struct is_property_key : std::true_type {}; template <> struct is_property_key : std::true_type {}; -} // namespace experimental -} // namespace oneapi -} // namespace ext -} // namespace sycl +template +struct has_compile_time_kernel_effect> : std::true_type {}; +template +struct has_compile_time_kernel_effect> : std::true_type {}; +template +struct has_compile_time_kernel_effect> : std::true_type {}; +template +struct has_compile_time_kernel_effect> : std::true_type {}; + +} // namespace sycl::ext::oneapi::experimental ``` |=== @@ -320,6 +344,23 @@ class handler { range workGroupSize, PropertyList properties, const WorkgroupFunctionType &kernelFunc); + + // Available only if `!has_compile_time_kernel_effect` for all + // properties `PropertyT` in `PropertyList`. + template + void single_task(PropertyList properties, const kernel& kernelObject); + + // Available only if `!has_compile_time_kernel_effect` for all + // properties `PropertyT` in `PropertyList`. + template + void parallel_for(range numWorkItems, PropertyList properties, + const kernel& kernelObject); + + // Available only if `!has_compile_time_kernel_effect` for all + // properties `PropertyT` in `PropertyList`. + template + void parallel_for(nd_range ndRange, PropertyList properties, + const kernel& kernelObject); } } ``` diff --git a/sycl/doc/extensions/proposed/sycl_ext_intel_fpga_kernel_interface_properties.asciidoc b/sycl/doc/extensions/proposed/sycl_ext_intel_fpga_kernel_interface_properties.asciidoc index 73bf4a6dfdb22..ae86d9e0e962b 100644 --- a/sycl/doc/extensions/proposed/sycl_ext_intel_fpga_kernel_interface_properties.asciidoc +++ b/sycl/doc/extensions/proposed/sycl_ext_intel_fpga_kernel_interface_properties.asciidoc @@ -92,7 +92,8 @@ using the mechanism defined in sycl_ext_oneapi_kernel_properties. === Kernel Interface Properties ```c++ -namespace sycl::ext::intel::experimental { +namespace sycl::ext { +namespace intel::experimental { enum class streaming_interface_options_enum { accept_downstream_stall, @@ -167,11 +168,23 @@ inline constexpr fpga_cluster_key::value_t< inline constexpr fpga_cluster_key::value_t< fpga_cluster_options_enum::stall_free_clusters> stall_free_clusters; -template <> struct is_property_key : std::true_type {}; -template <> struct is_property_key : std::true_type {}; -template <> struct is_property_key : std::true_type {}; +} // intel::experimental -} // namespace sycl::ext::intel::experimental +namespace oneapi::experimental { + +template <> struct is_property_key : std::true_type {}; +template <> struct is_property_key : std::true_type {}; +template <> struct is_property_key : std::true_type {}; + +template +struct has_compile_time_kernel_effect> : std::true_type {}; +template +struct has_compile_time_kernel_effect> : std::true_type {}; +template +struct has_compile_time_kernel_effect> : std::true_type {}; + +} // intel::experimental +} // namespace sycl::ext ``` |=== diff --git a/sycl/include/sycl/detail/kernel_properties.hpp b/sycl/include/sycl/detail/kernel_properties.hpp index cd1b9ef7929a2..4258b594bc69a 100644 --- a/sycl/include/sycl/detail/kernel_properties.hpp +++ b/sycl/include/sycl/detail/kernel_properties.hpp @@ -45,6 +45,7 @@ struct PropertyMetaInfo> { static constexpr const char *name = "sycl-register-alloc-mode"; static constexpr sycl::detail::register_alloc_mode_enum value = Mode; }; + } // namespace detail } // namespace ext::oneapi::experimental } // namespace _V1 diff --git a/sycl/include/sycl/ext/intel/experimental/fpga_kernel_properties.hpp b/sycl/include/sycl/ext/intel/experimental/fpga_kernel_properties.hpp index 7628fb40bf4ca..df29da6da4b17 100644 --- a/sycl/include/sycl/ext/intel/experimental/fpga_kernel_properties.hpp +++ b/sycl/include/sycl/ext/intel/experimental/fpga_kernel_properties.hpp @@ -103,6 +103,15 @@ struct is_property_key_of< intel::experimental::fpga_kernel_attribute> : std::true_type {}; +template +struct has_compile_time_kernel_effect< + intel::experimental::streaming_interface_key::value_t