@@ -1347,89 +1347,60 @@ class __SYCL_EXPORT handler {
1347
1347
#endif
1348
1348
}
1349
1349
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>
1392
1361
static void kernel_single_task_unpack (handler *Caller,
1393
1362
_KERNELFUNCPARAM (KernelFunc),
1394
- kernel_handler KH) {
1363
+ kernel_handler_or_none... KH) {
1395
1364
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...);
1405
1366
}
1406
1367
1407
- template <typename KernelName, typename ElementType, typename KernelType>
1368
+ template <typename KernelName, typename ElementType, typename KernelType,
1369
+ typename ... kernel_handler_or_none>
1408
1370
static void kernel_parallel_for_unpack (handler *Caller,
1409
1371
_KERNELFUNCPARAM (KernelFunc),
1410
- kernel_handler KH) {
1372
+ kernel_handler_or_none... KH) {
1411
1373
Caller
1412
1374
->kernel_parallel_for <KernelName, ElementType, KernelType, Props...>(
1413
- KernelFunc, KH);
1375
+ KernelFunc, KH... );
1414
1376
}
1415
1377
1416
- template <typename KernelName, typename ElementType, typename KernelType>
1378
+ template <typename KernelName, typename ElementType, typename KernelType,
1379
+ typename ... kernel_handler_or_none>
1417
1380
static void
1418
1381
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) {
1427
1384
Caller->kernel_parallel_for_work_group <KernelName, ElementType,
1428
1385
KernelType, Props...>(KernelFunc,
1429
- KH);
1386
+ KH... );
1430
1387
}
1431
1388
};
1432
1389
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
+
1433
1404
// Wrappers for kernel_*** functions above with and without support of
1434
1405
// additional kernel_handler argument.
1435
1406
0 commit comments