Skip to content

Commit 6d17c8f

Browse files
[NFC][SYCL] Minor refactor for KernelPropertiesUnpacker
1 parent 77b1e9d commit 6d17c8f

File tree

1 file changed

+36
-65
lines changed

1 file changed

+36
-65
lines changed

sycl/include/sycl/handler.hpp

Lines changed: 36 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1347,89 +1347,60 @@ class __SYCL_EXPORT handler {
13471347
#endif
13481348
}
13491349

1350-
template <typename PropertiesT> struct KernelPropertiesUnpacker {
1351-
template <typename KernelName, typename KernelType>
1352-
static void kernel_single_task_unpack(handler *, _KERNELFUNCPARAMTYPE) {}
1353-
1354-
template <typename KernelName, typename KernelType>
1355-
static void kernel_single_task_unpack(handler *, _KERNELFUNCPARAMTYPE,
1356-
kernel_handler) {}
1357-
1358-
template <typename KernelName, typename ElementType, typename KernelType>
1359-
static void kernel_parallel_for_unpack(handler *, _KERNELFUNCPARAMTYPE) {}
1360-
1361-
template <typename KernelName, typename ElementType, typename KernelType>
1362-
static void kernel_parallel_for_unpack(handler *, _KERNELFUNCPARAMTYPE,
1363-
kernel_handler) {}
1364-
1365-
template <typename KernelName, typename ElementType, typename KernelType>
1366-
static void kernel_parallel_for_work_group_unpack(handler *,
1367-
_KERNELFUNCPARAMTYPE) {}
1368-
1369-
template <typename KernelName, typename ElementType, typename KernelType>
1370-
static void kernel_parallel_for_work_group_unpack(handler *,
1371-
_KERNELFUNCPARAMTYPE,
1372-
kernel_handler) {}
1373-
1374-
// This should always fail but must be dependent to avoid always failing.
1375-
// It is defined after the shell members to avoid that they are stripped
1376-
// from the class.
1377-
static_assert(
1378-
ext::oneapi::experimental::is_property_list<PropertiesT>::value,
1379-
"Template type is not a property list.");
1380-
};
1381-
1382-
template <typename... Props>
1383-
struct KernelPropertiesUnpacker<
1384-
ext::oneapi::experimental::detail::properties_t<Props...>> {
1385-
template <typename KernelName, typename KernelType>
1386-
static void kernel_single_task_unpack(handler *Caller,
1387-
_KERNELFUNCPARAM(KernelFunc)) {
1388-
Caller->kernel_single_task<KernelName, KernelType, Props...>(KernelFunc);
1389-
}
1390-
1391-
template <typename KernelName, typename KernelType>
1350+
template <typename... Props> struct KernelPropertiesUnpackerImpl {
1351+
// Just pass extra Props... as template parameters to the underlying
1352+
// Caller->* member functions. Don't have reflection so try to use
1353+
// templates as much as possible to reduce the amount of boilerplate code
1354+
// needed. All the type checks are expected to be done at the Caller's
1355+
// methods side. Note that we cannot simply forward incoming arguments as
1356+
// deduced types aren't always the same and we cannot rely on type deduction
1357+
// as we need to pass Props... explicitly.
1358+
1359+
template <typename KernelName, typename KernelType,
1360+
typename... kernel_handler_or_none>
13921361
static void kernel_single_task_unpack(handler *Caller,
13931362
_KERNELFUNCPARAM(KernelFunc),
1394-
kernel_handler KH) {
1363+
kernel_handler_or_none... KH) {
13951364
Caller->kernel_single_task<KernelName, KernelType, Props...>(KernelFunc,
1396-
KH);
1397-
}
1398-
1399-
template <typename KernelName, typename ElementType, typename KernelType>
1400-
static void kernel_parallel_for_unpack(handler *Caller,
1401-
_KERNELFUNCPARAM(KernelFunc)) {
1402-
Caller
1403-
->kernel_parallel_for<KernelName, ElementType, KernelType, Props...>(
1404-
KernelFunc);
1365+
KH...);
14051366
}
14061367

1407-
template <typename KernelName, typename ElementType, typename KernelType>
1368+
template <typename KernelName, typename ElementType, typename KernelType,
1369+
typename... kernel_handler_or_none>
14081370
static void kernel_parallel_for_unpack(handler *Caller,
14091371
_KERNELFUNCPARAM(KernelFunc),
1410-
kernel_handler KH) {
1372+
kernel_handler_or_none... KH) {
14111373
Caller
14121374
->kernel_parallel_for<KernelName, ElementType, KernelType, Props...>(
1413-
KernelFunc, KH);
1375+
KernelFunc, KH...);
14141376
}
14151377

1416-
template <typename KernelName, typename ElementType, typename KernelType>
1378+
template <typename KernelName, typename ElementType, typename KernelType,
1379+
typename... kernel_handler_or_none>
14171380
static void
14181381
kernel_parallel_for_work_group_unpack(handler *Caller,
1419-
_KERNELFUNCPARAM(KernelFunc)) {
1420-
Caller->kernel_parallel_for_work_group<KernelName, ElementType,
1421-
KernelType, Props...>(KernelFunc);
1422-
}
1423-
1424-
template <typename KernelName, typename ElementType, typename KernelType>
1425-
static void kernel_parallel_for_work_group_unpack(
1426-
handler *Caller, _KERNELFUNCPARAM(KernelFunc), kernel_handler KH) {
1382+
_KERNELFUNCPARAM(KernelFunc),
1383+
kernel_handler_or_none... KH) {
14271384
Caller->kernel_parallel_for_work_group<KernelName, ElementType,
14281385
KernelType, Props...>(KernelFunc,
1429-
KH);
1386+
KH...);
14301387
}
14311388
};
14321389

1390+
template <typename PropertiesT>
1391+
struct KernelPropertiesUnpacker : public KernelPropertiesUnpackerImpl<> {
1392+
// This should always fail but must be dependent to avoid failing even if
1393+
// not instantiated.
1394+
static_assert(
1395+
ext::oneapi::experimental::is_property_list<PropertiesT>::value,
1396+
"Template type is not a property list.");
1397+
};
1398+
1399+
template <typename... Props>
1400+
struct KernelPropertiesUnpacker<
1401+
ext::oneapi::experimental::detail::properties_t<Props...>>
1402+
: public KernelPropertiesUnpackerImpl<Props...> {};
1403+
14331404
// Wrappers for kernel_*** functions above with and without support of
14341405
// additional kernel_handler argument.
14351406

0 commit comments

Comments
 (0)