@@ -491,6 +491,25 @@ class __SYCL_EXPORT handler {
491
491
" a single kernel or explicit memory operation." );
492
492
}
493
493
494
+ template <class Kernel > void setDeviceKernelInfo (void *KernelFuncPtr) {
495
+ constexpr auto Info = detail::CompileTimeKernelInfo<Kernel>;
496
+ MKernelName = Info.Name ;
497
+ // TODO support ESIMD in no-integration-header case too.
498
+ setKernelInfo (KernelFuncPtr, Info.NumParams , Info.ParamDescGetter ,
499
+ Info.IsESIMD , Info.HasSpecialCaptures );
500
+ setDeviceKernelInfoPtr (&detail::getDeviceKernelInfo<Kernel>());
501
+ setType (detail::CGType::Kernel);
502
+ }
503
+
504
+ void setDeviceKernelInfo (kernel &&Kernel) {
505
+ MKernel = detail::getSyclObjImpl (std::move (Kernel));
506
+ MKernelName = getKernelName ();
507
+ setType (detail::CGType::Kernel);
508
+
509
+ // If any extra actions are added here make sure that logic around
510
+ // `lambdaAndKernelHaveEqualName` calls can handle that.
511
+ }
512
+
494
513
#ifndef __INTEL_PREVIEW_BREAKING_CHANGES
495
514
// TODO: Those functions are not used anymore, remove it in the next
496
515
// ABI-breaking window.
@@ -823,7 +842,6 @@ class __SYCL_EXPORT handler {
823
842
detail::GetInstantiateKernelOnHostPtr<KernelType, LambdaArgType,
824
843
Dims>());
825
844
#endif
826
- constexpr auto Info = detail::CompileTimeKernelInfo<KernelName>;
827
845
828
846
// SYCL unittests are built without sycl compiler, so "host" information
829
847
// about kernels isn't provided (e.g., via integration headers or compiler
@@ -836,6 +854,8 @@ class __SYCL_EXPORT handler {
836
854
// don't actually execute those operation, that's why disabling
837
855
// unconditional `static_asserts`s is enough for now.
838
856
#ifndef __SYCL_UNITTESTS
857
+ constexpr auto Info = detail::CompileTimeKernelInfo<KernelName>;
858
+
839
859
static_assert (Info.Name != std::string_view{}, " Kernel must have a name!" );
840
860
841
861
// Some host compilers may have different captures from Clang. Currently
@@ -855,12 +875,7 @@ class __SYCL_EXPORT handler {
855
875
" might also help." );
856
876
#endif
857
877
858
- // Force hasSpecialCaptures to be evaluated at compile-time.
859
- setKernelInfo ((void *)MHostKernel->getPtr (), Info.NumParams ,
860
- Info.ParamDescGetter , Info.IsESIMD , Info.HasSpecialCaptures );
861
-
862
- MKernelName = Info.Name ;
863
- setDeviceKernelInfoPtr (&detail::getDeviceKernelInfo<KernelName>());
878
+ setDeviceKernelInfo<KernelName>((void *)MHostKernel->getPtr ());
864
879
865
880
// If the kernel lambda is callable with a kernel_handler argument, manifest
866
881
// the associated kernel handler.
@@ -1302,7 +1317,6 @@ class __SYCL_EXPORT handler {
1302
1317
setNDRangeDescriptor (RoundedRange);
1303
1318
StoreLambda<KName, decltype (Wrapper), Dims, TransformedArgType>(
1304
1319
std::move (Wrapper));
1305
- setType (detail::CGType::Kernel);
1306
1320
#endif
1307
1321
} else
1308
1322
#endif // !__SYCL_DISABLE_PARALLEL_FOR_RANGE_ROUNDING__ &&
@@ -1324,7 +1338,6 @@ class __SYCL_EXPORT handler {
1324
1338
setNDRangeDescriptor (std::move (UserRange));
1325
1339
StoreLambda<NameT, KernelType, Dims, TransformedArgType>(
1326
1340
std::move (KernelFunc));
1327
- setType (detail::CGType::Kernel);
1328
1341
#endif
1329
1342
#else
1330
1343
(void )KernelFunc;
@@ -1346,13 +1359,11 @@ class __SYCL_EXPORT handler {
1346
1359
[[maybe_unused]] kernel Kernel) {
1347
1360
#ifndef __SYCL_DEVICE_ONLY__
1348
1361
throwIfActionIsCreated ();
1349
- MKernel = detail::getSyclObjImpl (std::move (Kernel));
1362
+ setDeviceKernelInfo (std::move (Kernel));
1350
1363
detail::checkValueRange<Dims>(NumWorkItems);
1351
1364
setNDRangeDescriptor (std::move (NumWorkItems));
1352
1365
processLaunchProperties<PropertiesT>(Props);
1353
- setType (detail::CGType::Kernel);
1354
1366
extractArgsAndReqs ();
1355
- MKernelName = getKernelName ();
1356
1367
#endif
1357
1368
}
1358
1369
@@ -1371,13 +1382,11 @@ class __SYCL_EXPORT handler {
1371
1382
[[maybe_unused]] kernel Kernel) {
1372
1383
#ifndef __SYCL_DEVICE_ONLY__
1373
1384
throwIfActionIsCreated ();
1374
- MKernel = detail::getSyclObjImpl (std::move (Kernel));
1385
+ setDeviceKernelInfo (std::move (Kernel));
1375
1386
detail::checkValueRange<Dims>(NDRange);
1376
1387
setNDRangeDescriptor (std::move (NDRange));
1377
1388
processLaunchProperties (Props);
1378
- setType (detail::CGType::Kernel);
1379
1389
extractArgsAndReqs ();
1380
- MKernelName = getKernelName ();
1381
1390
#endif
1382
1391
}
1383
1392
@@ -1404,7 +1413,6 @@ class __SYCL_EXPORT handler {
1404
1413
}
1405
1414
throwIfActionIsCreated ();
1406
1415
verifyUsedKernelBundleInternal (Info.Name );
1407
- setType (detail::CGType::Kernel);
1408
1416
1409
1417
detail::checkValueRange<Dims>(params...);
1410
1418
if constexpr (SetNumWorkGroups) {
@@ -1450,7 +1458,6 @@ class __SYCL_EXPORT handler {
1450
1458
// kernel.
1451
1459
setHandlerKernelBundle (Kernel);
1452
1460
verifyUsedKernelBundleInternal (Info.Name );
1453
- setType (detail::CGType::Kernel);
1454
1461
1455
1462
detail::checkValueRange<Dims>(params...);
1456
1463
if constexpr (SetNumWorkGroups) {
@@ -1460,12 +1467,11 @@ class __SYCL_EXPORT handler {
1460
1467
setNDRangeDescriptor (std::move (params)...);
1461
1468
}
1462
1469
1463
- MKernel = detail::getSyclObjImpl (std::move (Kernel));
1464
- if (!lambdaAndKernelHaveEqualName<NameT>()) {
1465
- extractArgsAndReqs ();
1466
- MKernelName = getKernelName ();
1467
- } else {
1470
+ setDeviceKernelInfo (std::move (Kernel));
1471
+ if (lambdaAndKernelHaveEqualName<NameT>()) {
1468
1472
StoreLambda<NameT, KernelType, Dims, ElementType>(std::move (KernelFunc));
1473
+ } else {
1474
+ extractArgsAndReqs ();
1469
1475
}
1470
1476
processProperties<Info.IsESIMD , PropertiesT>(Props);
1471
1477
#endif
@@ -1845,10 +1851,8 @@ class __SYCL_EXPORT handler {
1845
1851
// No need to check if range is out of INT_MAX limits as it's compile-time
1846
1852
// known constant
1847
1853
setNDRangeDescriptor (range<1 >{1 });
1848
- MKernel = detail::getSyclObjImpl (std::move (Kernel));
1849
- setType (detail::CGType::Kernel);
1854
+ setDeviceKernelInfo (std::move (Kernel));
1850
1855
extractArgsAndReqs ();
1851
- MKernelName = getKernelName ();
1852
1856
}
1853
1857
1854
1858
void parallel_for (range<1 > NumWorkItems, kernel Kernel) {
@@ -1881,12 +1885,10 @@ class __SYCL_EXPORT handler {
1881
1885
[[maybe_unused]] kernel Kernel) {
1882
1886
#ifndef __SYCL_DEVICE_ONLY__
1883
1887
throwIfActionIsCreated ();
1884
- MKernel = detail::getSyclObjImpl (std::move (Kernel));
1888
+ setDeviceKernelInfo (std::move (Kernel));
1885
1889
detail::checkValueRange<Dims>(NumWorkItems, WorkItemOffset);
1886
1890
setNDRangeDescriptor (std::move (NumWorkItems), std::move (WorkItemOffset));
1887
- setType (detail::CGType::Kernel);
1888
1891
extractArgsAndReqs ();
1889
- MKernelName = getKernelName ();
1890
1892
#endif
1891
1893
}
1892
1894
@@ -1924,13 +1926,12 @@ class __SYCL_EXPORT handler {
1924
1926
// No need to check if range is out of INT_MAX limits as it's compile-time
1925
1927
// known constant
1926
1928
setNDRangeDescriptor (range<1 >{1 });
1927
- MKernel = detail::getSyclObjImpl (std::move (Kernel));
1928
- setType (detail::CGType::Kernel);
1929
- if (!lambdaAndKernelHaveEqualName<NameT>()) {
1930
- extractArgsAndReqs ();
1931
- MKernelName = getKernelName ();
1932
- } else
1929
+ setDeviceKernelInfo (std::move (Kernel));
1930
+ if (lambdaAndKernelHaveEqualName<NameT>()) {
1933
1931
StoreLambda<NameT, KernelType, /* Dims*/ 1 , void >(std::move (KernelFunc));
1932
+ } else {
1933
+ extractArgsAndReqs ();
1934
+ }
1934
1935
#else
1935
1936
detail::CheckDeviceCopyable<KernelType>();
1936
1937
#endif
0 commit comments