diff --git a/sycl/include/sycl/handler.hpp b/sycl/include/sycl/handler.hpp index 1f40aed34d350..8cfd17e65376e 100644 --- a/sycl/include/sycl/handler.hpp +++ b/sycl/include/sycl/handler.hpp @@ -491,6 +491,25 @@ class __SYCL_EXPORT handler { "a single kernel or explicit memory operation."); } + template void setDeviceKernelInfo(void *KernelFuncPtr) { + constexpr auto Info = detail::CompileTimeKernelInfo; + MKernelName = Info.Name; + // TODO support ESIMD in no-integration-header case too. + setKernelInfo(KernelFuncPtr, Info.NumParams, Info.ParamDescGetter, + Info.IsESIMD, Info.HasSpecialCaptures); + setDeviceKernelInfoPtr(&detail::getDeviceKernelInfo()); + setType(detail::CGType::Kernel); + } + + void setDeviceKernelInfo(kernel &&Kernel) { + MKernel = detail::getSyclObjImpl(std::move(Kernel)); + MKernelName = getKernelName(); + setType(detail::CGType::Kernel); + + // If any extra actions are added here make sure that logic around + // `lambdaAndKernelHaveEqualName` calls can handle that. + } + #ifndef __INTEL_PREVIEW_BREAKING_CHANGES // TODO: Those functions are not used anymore, remove it in the next // ABI-breaking window. @@ -823,7 +842,6 @@ class __SYCL_EXPORT handler { detail::GetInstantiateKernelOnHostPtr()); #endif - constexpr auto Info = detail::CompileTimeKernelInfo; // SYCL unittests are built without sycl compiler, so "host" information // about kernels isn't provided (e.g., via integration headers or compiler @@ -836,6 +854,8 @@ class __SYCL_EXPORT handler { // don't actually execute those operation, that's why disabling // unconditional `static_asserts`s is enough for now. #ifndef __SYCL_UNITTESTS_BYPASS_KERNEL_NAME_CHECK + constexpr auto Info = detail::CompileTimeKernelInfo; + static_assert(Info.Name != std::string_view{}, "Kernel must have a name!"); // Some host compilers may have different captures from Clang. Currently @@ -855,12 +875,7 @@ class __SYCL_EXPORT handler { "might also help."); #endif - // Force hasSpecialCaptures to be evaluated at compile-time. - setKernelInfo((void *)MHostKernel->getPtr(), Info.NumParams, - Info.ParamDescGetter, Info.IsESIMD, Info.HasSpecialCaptures); - - MKernelName = Info.Name; - setDeviceKernelInfoPtr(&detail::getDeviceKernelInfo()); + setDeviceKernelInfo((void *)MHostKernel->getPtr()); // If the kernel lambda is callable with a kernel_handler argument, manifest // the associated kernel handler. @@ -1302,7 +1317,6 @@ class __SYCL_EXPORT handler { setNDRangeDescriptor(RoundedRange); StoreLambda( std::move(Wrapper)); - setType(detail::CGType::Kernel); #endif } else #endif // !__SYCL_DISABLE_PARALLEL_FOR_RANGE_ROUNDING__ && @@ -1324,7 +1338,6 @@ class __SYCL_EXPORT handler { setNDRangeDescriptor(std::move(UserRange)); StoreLambda( std::move(KernelFunc)); - setType(detail::CGType::Kernel); #endif #else (void)KernelFunc; @@ -1346,13 +1359,11 @@ class __SYCL_EXPORT handler { [[maybe_unused]] kernel Kernel) { #ifndef __SYCL_DEVICE_ONLY__ throwIfActionIsCreated(); - MKernel = detail::getSyclObjImpl(std::move(Kernel)); + setDeviceKernelInfo(std::move(Kernel)); detail::checkValueRange(NumWorkItems); setNDRangeDescriptor(std::move(NumWorkItems)); processLaunchProperties(Props); - setType(detail::CGType::Kernel); extractArgsAndReqs(); - MKernelName = getKernelName(); #endif } @@ -1371,13 +1382,11 @@ class __SYCL_EXPORT handler { [[maybe_unused]] kernel Kernel) { #ifndef __SYCL_DEVICE_ONLY__ throwIfActionIsCreated(); - MKernel = detail::getSyclObjImpl(std::move(Kernel)); + setDeviceKernelInfo(std::move(Kernel)); detail::checkValueRange(NDRange); setNDRangeDescriptor(std::move(NDRange)); processLaunchProperties(Props); - setType(detail::CGType::Kernel); extractArgsAndReqs(); - MKernelName = getKernelName(); #endif } @@ -1404,7 +1413,6 @@ class __SYCL_EXPORT handler { } throwIfActionIsCreated(); verifyUsedKernelBundleInternal(Info.Name); - setType(detail::CGType::Kernel); detail::checkValueRange(params...); if constexpr (SetNumWorkGroups) { @@ -1450,7 +1458,6 @@ class __SYCL_EXPORT handler { // kernel. setHandlerKernelBundle(Kernel); verifyUsedKernelBundleInternal(Info.Name); - setType(detail::CGType::Kernel); detail::checkValueRange(params...); if constexpr (SetNumWorkGroups) { @@ -1460,12 +1467,11 @@ class __SYCL_EXPORT handler { setNDRangeDescriptor(std::move(params)...); } - MKernel = detail::getSyclObjImpl(std::move(Kernel)); - if (!lambdaAndKernelHaveEqualName()) { - extractArgsAndReqs(); - MKernelName = getKernelName(); - } else { + setDeviceKernelInfo(std::move(Kernel)); + if (lambdaAndKernelHaveEqualName()) { StoreLambda(std::move(KernelFunc)); + } else { + extractArgsAndReqs(); } processProperties(Props); #endif @@ -1845,10 +1851,8 @@ class __SYCL_EXPORT handler { // No need to check if range is out of INT_MAX limits as it's compile-time // known constant setNDRangeDescriptor(range<1>{1}); - MKernel = detail::getSyclObjImpl(std::move(Kernel)); - setType(detail::CGType::Kernel); + setDeviceKernelInfo(std::move(Kernel)); extractArgsAndReqs(); - MKernelName = getKernelName(); } void parallel_for(range<1> NumWorkItems, kernel Kernel) { @@ -1881,12 +1885,10 @@ class __SYCL_EXPORT handler { [[maybe_unused]] kernel Kernel) { #ifndef __SYCL_DEVICE_ONLY__ throwIfActionIsCreated(); - MKernel = detail::getSyclObjImpl(std::move(Kernel)); + setDeviceKernelInfo(std::move(Kernel)); detail::checkValueRange(NumWorkItems, WorkItemOffset); setNDRangeDescriptor(std::move(NumWorkItems), std::move(WorkItemOffset)); - setType(detail::CGType::Kernel); extractArgsAndReqs(); - MKernelName = getKernelName(); #endif } @@ -1924,13 +1926,12 @@ class __SYCL_EXPORT handler { // No need to check if range is out of INT_MAX limits as it's compile-time // known constant setNDRangeDescriptor(range<1>{1}); - MKernel = detail::getSyclObjImpl(std::move(Kernel)); - setType(detail::CGType::Kernel); - if (!lambdaAndKernelHaveEqualName()) { - extractArgsAndReqs(); - MKernelName = getKernelName(); - } else + setDeviceKernelInfo(std::move(Kernel)); + if (lambdaAndKernelHaveEqualName()) { StoreLambda(std::move(KernelFunc)); + } else { + extractArgsAndReqs(); + } #else detail::CheckDeviceCopyable(); #endif diff --git a/sycl/test/abi/sycl_symbols_windows.dump b/sycl/test/abi/sycl_symbols_windows.dump index bdea6ef268fc3..b3453854edec8 100644 --- a/sycl/test/abi/sycl_symbols_windows.dump +++ b/sycl/test/abi/sycl_symbols_windows.dump @@ -4409,6 +4409,7 @@ ?setArgsHelper@handler@_V1@sycl@@AEAAXH@Z ?setArgsToAssociatedAccessors@handler@_V1@sycl@@AEAAXXZ ?setDevice@HostProfilingInfo@detail@_V1@sycl@@QEAAXPEAVdevice_impl@234@@Z +?setDeviceKernelInfo@handler@_V1@sycl@@AEAAX$$QEAVkernel@23@@Z ?setDeviceKernelInfoPtr@handler@_V1@sycl@@AEAAXPEAVDeviceKernelInfo@detail@23@@Z ?setHandlerKernelBundle@handler@_V1@sycl@@AEAAXAEBV?$shared_ptr@Vkernel_bundle_impl@detail@_V1@sycl@@@std@@@Z ?setHandlerKernelBundle@handler@_V1@sycl@@AEAAXVkernel@23@@Z