38 namespace experimental {
40 namespace sycl_exp = sycl::ext::oneapi::experimental;
44 static_assert(sycl_exp::is_property_list_v<Properties>);
47 template <
typename...
Props>
50 template <
typename...
Props>
52 :
props{properties} {}
57 template <
typename... Props,
typename = std::enable_if_t<detail::are_all_props<Props...>::value,
void>>
61 template <
typename... Props>
67 static_assert(sycl_exp::is_property_list_v<Properties>);
70 template <
typename...
Props>
73 template <
typename...
Props>
75 :
props{properties} {}
80 template <
typename... Props,
typename = std::enable_if_t<detail::are_all_props<Props...>::value,
void>>
84 template <
typename... Props>
95 template <
typename Range,
typename KProps,
typename LProps,
bool LocalMem>
97 static_assert(sycl_exp::is_property_list_v<KProps>);
98 static_assert(sycl_exp::is_property_list_v<LProps>);
99 static_assert(syclcompat::detail::is_range_or_nd_range_v<Range>);
100 static_assert(syclcompat::detail::is_nd_range_v<Range> || !LocalMem,
101 "sycl::range kernel launches are incompatible with local "
113 template <
typename... Ts>
115 : _kernel_properties{detail::property_getter<
117 std::tuple<Ts...>(ts...))},
118 _launch_properties{detail::property_getter<
120 std::tuple<Ts...>(ts...))},
123 std::tuple<Ts...>(ts...))} {
124 check_variadic_args(ts...);
127 template <
typename... Ts>
void check_variadic_args(Ts...) {
129 std::conjunction_v<std::disjunction<detail::is_kernel_properties<Ts>,
130 detail::is_launch_properties<Ts>,
131 detail::is_local_mem_size<Ts>>...>,
132 "Received an unexpected argument to ctor. Did you forget to wrap "
134 "compat::kernel_properties, launch_properties, local_mem_size?");
138 template <
typename... Ts>
141 check_variadic_args(ts...);
144 template <
typename... Ts>
146 _range = Range{global_range};
147 check_variadic_args(ts...);
150 template <
typename... Ts>
153 _range = Range{global_range * local_range, local_range};
154 check_variadic_args(ts...);
170 template <
typename Range,
typename... Ts>
176 template <
int Dim,
typename... Ts>
182 template <
typename... Ts>
188 template <
typename... Ts>
196 template <
auto F,
typename Range,
typename KProps,
bool HasLocalMem,
212 if constexpr (HasLocalMem) {
213 char *local_mem_ptr =
static_cast<char *
>(
214 _local_acc.template get_multi_ptr<sycl::access::decorated::no>().get());
216 [lmem_ptr = local_mem_ptr](
auto &&...args) { F(args..., lmem_ptr); },
225 std::conditional_t<HasLocalMem, sycl::local_accessor<char, 1>, std::monostate>
231 template <
auto F,
typename LaunchPolicy,
typename... Args>
235 typename LaunchPolicy::KPropsT, LaunchPolicy::HasLocalMem,
237 if constexpr (LaunchPolicy::HasLocalMem) {
241 typename LaunchPolicy::KPropsT,
242 LaunchPolicy::HasLocalMem, Args...>(
246 typename LaunchPolicy::KPropsT,
247 LaunchPolicy::HasLocalMem, Args...>(
Command group handler class.
Defines the iteration domain of both the work-groups and the overall dispatch.
Defines the iteration domain of either a single work-group in a parallel dispatch,...
static constexpr bool HasLocalMem
launch_policy(Range range, Ts... ts)
KProps get_kernel_properties()
launch_policy(dim3 global_range, Ts... ts)
LProps get_launch_properties()
size_t get_local_mem_size()
launch_policy(dim3 global_range, dim3 local_range, Ts... ts)
#define __syclcompat_inline__
constexpr tuple< Ts... > make_tuple(Ts... Args)
typename range_to_item_map< T >::ItemT range_to_item_t
auto build_kernel_functor(sycl::handler &cgh, LaunchPolicy launch_policy, Args... args) -> KernelFunctor< F, typename LaunchPolicy::RangeT, typename LaunchPolicy::KPropsT, LaunchPolicy::HasLocalMem, Args... >
kernel_properties(Props... props) -> kernel_properties< decltype(sycl_exp::properties(props...))>
launch_policy(Range, Ts...) -> launch_policy< Range, detail::properties_or_empty< kernel_properties, Ts... >, detail::properties_or_empty< launch_properties, Ts... >, detail::has_type< local_mem_size, std::tuple< Ts... >>::value >
launch_properties(Props... props) -> launch_properties< decltype(sycl_exp::properties(props...))>
std::tuple< Args... > _argument_tuple
KernelFunctor(KProps kernel_props, sycl::local_accessor< char, 1 > local_acc, Args... args)
std::conditional_t< HasLocalMem, sycl::local_accessor< char, 1 >, std::monostate > _local_acc
auto get(sycl_exp::properties_tag)
__syclcompat_inline__ void operator()(syclcompat::detail::range_to_item_t< Range >) const
KernelFunctor(KProps kernel_props, Args... args)
KProps _kernel_properties
kernel_properties(Props... properties)
kernel_properties(sycl_exp::properties< Props... > properties)
launch_properties(Props... properties)
launch_properties(sycl_exp::properties< Props... > properties)
local_mem_size(size_t size=0)