Skip to content

Commit afcb732

Browse files
[NFC][SYCL] Use CompileTimeKernelInfo instead of individual properties
Factored out from #19929.
1 parent 81bb879 commit afcb732

File tree

9 files changed

+106
-157
lines changed

9 files changed

+106
-157
lines changed

sycl/include/sycl/detail/compile_time_kernel_info.hpp

Lines changed: 61 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,38 +13,85 @@
1313
namespace sycl {
1414
inline namespace _V1 {
1515
namespace detail {
16-
inline namespace compile_time_kernel_info_v1 {
1716

17+
template <typename KernelNameType>
18+
constexpr kernel_param_desc_t getKernelParamDesc(int Idx) {
19+
#ifndef __INTEL_SYCL_USE_INTEGRATION_HEADERS
20+
kernel_param_desc_t ParamDesc;
21+
ParamDesc.kind =
22+
__builtin_sycl_kernel_param_kind(KernelIdentity<KernelNameType>(), Idx);
23+
ParamDesc.info = ParamDesc.kind == kernel_param_kind_t::kind_accessor
24+
? __builtin_sycl_kernel_param_access_target(
25+
KernelIdentity<KernelNameType>(), Idx)
26+
: __builtin_sycl_kernel_param_size(
27+
KernelIdentity<KernelNameType>(), Idx);
28+
ParamDesc.offset =
29+
__builtin_sycl_kernel_param_offset(KernelIdentity<KernelNameType>(), Idx);
30+
return ParamDesc;
31+
#else
32+
return KernelInfo<KernelNameType>::getParamDesc(Idx);
33+
#endif
34+
}
35+
36+
inline namespace compile_time_kernel_info_v1 {
1837
// This is being passed across ABI boundary, so we don't use std::string_view,
1938
// at least for as long as we support user apps built with GNU libstdc++'s
2039
// pre-C++11 ABI.
2140
struct CompileTimeKernelInfoTy {
22-
detail::string_view Name;
41+
detail::string_view Name{};
2342
unsigned NumParams = 0;
2443
bool IsESIMD = false;
44+
// TODO: Can we just have code_location here?
2545
detail::string_view FileName{};
2646
detail::string_view FunctionName{};
2747
unsigned LineNumber = 0;
2848
unsigned ColumnNumber = 0;
2949
int64_t KernelSize = 0;
3050
using ParamDescGetterT = kernel_param_desc_t (*)(int);
3151
ParamDescGetterT ParamDescGetter = nullptr;
32-
bool HasSpecialCaptures = true;
52+
53+
bool HasSpecialCaptures = [this]() constexpr {
54+
// No-compile time info for the kernel (i.e., kernel_bundle/interop/etc.),
55+
// be conservative:
56+
if (NumParams == 0)
57+
return true;
58+
59+
for (unsigned I = 0; I < NumParams; ++I) {
60+
auto ParamDesc = ParamDescGetter(I);
61+
if (ParamDesc.kind != kernel_param_kind_t::kind_std_layout &&
62+
ParamDesc.kind != kernel_param_kind_t::kind_pointer)
63+
return true;
64+
}
65+
66+
return false;
67+
}();
3368
};
3469

3570
template <class Kernel>
3671
inline constexpr CompileTimeKernelInfoTy CompileTimeKernelInfo{
37-
std::string_view(getKernelName<Kernel>()),
38-
getKernelNumParams<Kernel>(),
39-
isKernelESIMD<Kernel>(),
40-
std::string_view(getKernelFileName<Kernel>()),
41-
std::string_view(getKernelFunctionName<Kernel>()),
42-
getKernelLineNumber<Kernel>(),
43-
getKernelColumnNumber<Kernel>(),
44-
getKernelSize<Kernel>(),
45-
&getKernelParamDesc<Kernel>,
46-
hasSpecialCaptures<Kernel>()};
47-
72+
#ifndef __INTEL_SYCL_USE_INTEGRATION_HEADERS
73+
__builtin_sycl_kernel_name(KernelIdentity<Kernel>()),
74+
__builtin_sycl_kernel_param_count(KernelIdentity<Kernel>()),
75+
false /*IsESIMD*/, // TODO needs a builtin counterpart
76+
__builtin_sycl_kernel_file_name(KernelIdentity<Kernel>()),
77+
__builtin_sycl_kernel_function_name(KernelIdentity<Kernel>()),
78+
__builtin_sycl_kernel_line_number(KernelIdentity<Kernel>()),
79+
__builtin_sycl_kernel_column_number(KernelIdentity<Kernel>()),
80+
// TODO needs a builtin counterpart, but is currently only used for checking
81+
// cases with external host compiler, which use integration headers.
82+
0 /* KernelSize */, &getKernelParamDesc<Kernel>
83+
#else
84+
detail::string_view{KernelInfo<Kernel>::getName()},
85+
KernelInfo<Kernel>::getNumParams(), KernelInfo<Kernel>::isESIMD(),
86+
detail::string_view{KernelInfo<Kernel>::getFileName()},
87+
detail::string_view{KernelInfo<Kernel>::getFunctionName()},
88+
KernelInfo<Kernel>::getLineNumber(), KernelInfo<Kernel>::getColumnNumber(),
89+
KernelInfo<Kernel>::getKernelSize(),
90+
// Can't use KernelInfo::getParamDesc due to different return type (const
91+
// ref vs. by val):
92+
&getKernelParamDesc<Kernel>
93+
#endif
94+
};
4895
} // namespace compile_time_kernel_info_v1
4996
} // namespace detail
5097
} // namespace _V1

sycl/include/sycl/detail/kernel_desc.hpp

Lines changed: 0 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -187,96 +187,6 @@ template <typename KNT> struct KernelIdentity {
187187
using type = KNT;
188188
};
189189

190-
template <typename KernelNameType> constexpr unsigned getKernelNumParams() {
191-
#ifndef __INTEL_SYCL_USE_INTEGRATION_HEADERS
192-
return __builtin_sycl_kernel_param_count(KernelIdentity<KernelNameType>());
193-
#else
194-
return KernelInfo<KernelNameType>::getNumParams();
195-
#endif
196-
}
197-
198-
template <typename KernelNameType>
199-
constexpr kernel_param_desc_t getKernelParamDesc(int Idx) {
200-
#ifndef __INTEL_SYCL_USE_INTEGRATION_HEADERS
201-
kernel_param_desc_t ParamDesc;
202-
ParamDesc.kind =
203-
__builtin_sycl_kernel_param_kind(KernelIdentity<KernelNameType>(), Idx);
204-
ParamDesc.info = ParamDesc.kind == kernel_param_kind_t::kind_accessor
205-
? __builtin_sycl_kernel_param_access_target(
206-
KernelIdentity<KernelNameType>(), Idx)
207-
: __builtin_sycl_kernel_param_size(
208-
KernelIdentity<KernelNameType>(), Idx);
209-
ParamDesc.offset =
210-
__builtin_sycl_kernel_param_offset(KernelIdentity<KernelNameType>(), Idx);
211-
return ParamDesc;
212-
#else
213-
return KernelInfo<KernelNameType>::getParamDesc(Idx);
214-
#endif
215-
}
216-
217-
template <typename KernelNameType> constexpr const char *getKernelName() {
218-
#ifndef __INTEL_SYCL_USE_INTEGRATION_HEADERS
219-
return __builtin_sycl_kernel_name(KernelIdentity<KernelNameType>());
220-
#else
221-
return KernelInfo<KernelNameType>::getName();
222-
#endif
223-
}
224-
225-
template <typename KernelNameType> constexpr bool isKernelESIMD() {
226-
// TODO Needs a builtin counterpart
227-
return KernelInfo<KernelNameType>::isESIMD();
228-
}
229-
230-
template <typename KernelNameType> constexpr const char *getKernelFileName() {
231-
#ifndef __INTEL_SYCL_USE_INTEGRATION_HEADERS
232-
return __builtin_sycl_kernel_file_name(KernelIdentity<KernelNameType>());
233-
#else
234-
return KernelInfo<KernelNameType>::getFileName();
235-
#endif
236-
}
237-
238-
template <typename KernelNameType>
239-
constexpr const char *getKernelFunctionName() {
240-
#ifndef __INTEL_SYCL_USE_INTEGRATION_HEADERS
241-
return __builtin_sycl_kernel_function_name(KernelIdentity<KernelNameType>());
242-
#else
243-
return KernelInfo<KernelNameType>::getFunctionName();
244-
#endif
245-
}
246-
247-
template <typename KernelNameType> constexpr unsigned getKernelLineNumber() {
248-
#ifndef __INTEL_SYCL_USE_INTEGRATION_HEADERS
249-
return __builtin_sycl_kernel_line_number(KernelIdentity<KernelNameType>());
250-
#else
251-
return KernelInfo<KernelNameType>::getLineNumber();
252-
#endif
253-
}
254-
255-
template <typename KernelNameType> constexpr unsigned getKernelColumnNumber() {
256-
#ifndef __INTEL_SYCL_USE_INTEGRATION_HEADERS
257-
return __builtin_sycl_kernel_column_number(KernelIdentity<KernelNameType>());
258-
#else
259-
return KernelInfo<KernelNameType>::getColumnNumber();
260-
#endif
261-
}
262-
263-
template <typename KernelNameType> constexpr int64_t getKernelSize() {
264-
// TODO needs a builtin counterpart, but is currently only used for checking
265-
// cases with external host compiler, which use integration headers.
266-
return KernelInfo<KernelNameType>::getKernelSize();
267-
}
268-
269-
template <typename KernelNameType> constexpr bool hasSpecialCaptures() {
270-
bool FoundSpecialCapture = false;
271-
for (unsigned I = 0; I < getKernelNumParams<KernelNameType>(); ++I) {
272-
auto ParamDesc = getKernelParamDesc<KernelNameType>(I);
273-
bool IsSpecialCapture =
274-
(ParamDesc.kind != kernel_param_kind_t::kind_std_layout &&
275-
ParamDesc.kind != kernel_param_kind_t::kind_pointer);
276-
FoundSpecialCapture |= IsSpecialCapture;
277-
}
278-
return FoundSpecialCapture;
279-
}
280190
} // namespace detail
281191
} // namespace _V1
282192
} // namespace sycl

sycl/include/sycl/detail/kernel_launch_helper.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#pragma once
1010

1111
#include <sycl/detail/cg_types.hpp>
12+
#include <sycl/detail/compile_time_kernel_info.hpp>
1213
#include <sycl/detail/helpers.hpp>
1314
#include <sycl/ext/intel/experimental/fp_control_kernel_properties.hpp>
1415
#include <sycl/ext/intel/experimental/kernel_execution_properties.hpp>
@@ -261,7 +262,8 @@ struct KernelLaunchPropertyWrapper {
261262
if constexpr (ext::oneapi::experimental::detail::
262263
HasKernelPropertiesGetMethod<const KernelType &>::value) {
263264

264-
h->template processProperties<detail::isKernelESIMD<KernelName>()>(
265+
h->template processProperties<
266+
detail::CompileTimeKernelInfo<KernelName>.IsESIMD>(
265267
KernelFunc.get(ext::oneapi::experimental::properties_tag{}));
266268
}
267269
#endif

sycl/include/sycl/handler.hpp

Lines changed: 30 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -529,10 +529,8 @@ class __SYCL_EXPORT handler {
529529
// kernel. Else it is necessary use set_atg(s) for resolve the order and
530530
// values of arguments for the kernel.
531531
assert(MKernel && "MKernel is not initialized");
532-
constexpr std::string_view LambdaName =
533-
detail::getKernelName<LambdaNameT>();
534532
detail::ABINeutralKernelNameStrT KernelName = getKernelName();
535-
return KernelName == LambdaName;
533+
return KernelName == detail::CompileTimeKernelInfo<LambdaNameT>.Name;
536534
}
537535

538536
/// Saves the location of user's code passed in \p CodeLoc for future usage in
@@ -823,20 +821,18 @@ class __SYCL_EXPORT handler {
823821
detail::GetInstantiateKernelOnHostPtr<KernelType, LambdaArgType,
824822
Dims>());
825823
#endif
824+
constexpr auto Info = detail::CompileTimeKernelInfo<KernelName>;
826825

827-
constexpr bool KernelHasName =
828-
detail::getKernelName<KernelName>() != nullptr &&
829-
detail::getKernelName<KernelName>()[0] != '\0';
826+
constexpr bool KernelHasName = (Info.Name != std::string_view{});
830827

831828
// Some host compilers may have different captures from Clang. Currently
832-
// there is no stable way of handling this when extracting the captures, so
833-
// a static assert is made to fail for incompatible kernel lambdas.
829+
// there is no stable way of handling this when extracting the captures,
830+
// so a static assert is made to fail for incompatible kernel lambdas.
834831

835832
// TODO remove the ifdef once the kernel size builtin is supported.
836833
#ifdef __INTEL_SYCL_USE_INTEGRATION_HEADERS
837834
static_assert(
838-
!KernelHasName ||
839-
sizeof(KernelType) == detail::getKernelSize<KernelName>(),
835+
!KernelHasName || sizeof(KernelType) == Info.KernelSize,
840836
"Unexpected kernel lambda size. This can be caused by an "
841837
"external host compiler producing a lambda with an "
842838
"unexpected layout. This is a limitation of the compiler."
@@ -854,15 +850,11 @@ class __SYCL_EXPORT handler {
854850
// TODO support ESIMD in no-integration-header case too.
855851

856852
// Force hasSpecialCaptures to be evaluated at compile-time.
857-
constexpr bool HasSpecialCapt = detail::hasSpecialCaptures<KernelName>();
858-
setKernelInfo((void *)MHostKernel->getPtr(),
859-
detail::getKernelNumParams<KernelName>(),
860-
&(detail::getKernelParamDesc<KernelName>),
861-
detail::isKernelESIMD<KernelName>(), HasSpecialCapt);
862-
863-
constexpr std::string_view KernelNameStr =
864-
detail::getKernelName<KernelName>();
865-
MKernelName = KernelNameStr;
853+
setKernelInfo((void *)MHostKernel->getPtr(), Info.NumParams,
854+
Info.ParamDescGetter, Info.IsESIMD,
855+
Info.HasSpecialCaptures);
856+
857+
MKernelName = Info.Name;
866858
setDeviceKernelInfoPtr(&detail::getDeviceKernelInfo<KernelName>());
867859
} else {
868860
// In case w/o the integration header it is necessary to process
@@ -1240,6 +1232,12 @@ class __SYCL_EXPORT handler {
12401232
typename PropertiesT = ext::oneapi::experimental::empty_properties_t>
12411233
void parallel_for_lambda_impl(range<Dims> UserRange, PropertiesT Props,
12421234
const KernelType &KernelFunc) {
1235+
// TODO: Properties may change the kernel function, so in order to avoid
1236+
// conflicts they should be included in the name.
1237+
using NameT =
1238+
typename detail::get_kernel_name_t<KernelName, KernelType>::name;
1239+
constexpr auto Info = detail::CompileTimeKernelInfo<NameT>;
1240+
12431241
#ifndef __SYCL_DEVICE_ONLY__
12441242
throwIfActionIsCreated();
12451243
throwOnKernelParameterMisuse<KernelName, KernelType>();
@@ -1275,11 +1273,6 @@ class __SYCL_EXPORT handler {
12751273
"SYCL kernel lambda/functor has an unexpected signature, it should be "
12761274
"invocable with sycl::item and optionally sycl::kernel_handler");
12771275

1278-
// TODO: Properties may change the kernel function, so in order to avoid
1279-
// conflicts they should be included in the name.
1280-
using NameT =
1281-
typename detail::get_kernel_name_t<KernelName, KernelType>::name;
1282-
12831276
// Range rounding can be disabled by the user.
12841277
// Range rounding is supported only for newer SYCL standards.
12851278
#if !defined(__SYCL_DISABLE_PARALLEL_FOR_RANGE_ROUNDING__) && \
@@ -1301,8 +1294,7 @@ class __SYCL_EXPORT handler {
13011294
detail::KernelLaunchPropertyWrapper::parseProperties<KName>(this,
13021295
Wrapper);
13031296
#ifndef __SYCL_DEVICE_ONLY__
1304-
constexpr detail::string_view Name{detail::getKernelName<NameT>()};
1305-
verifyUsedKernelBundleInternal(Name);
1297+
verifyUsedKernelBundleInternal(Info.Name);
13061298
// We are executing over the rounded range, but there are still
13071299
// items/ids that are are constructed in ther range rounded
13081300
// kernel use items/ids in the user range, which means that
@@ -1328,10 +1320,8 @@ class __SYCL_EXPORT handler {
13281320
detail::KernelLaunchPropertyWrapper::parseProperties<NameT>(this,
13291321
KernelFunc);
13301322
#ifndef __SYCL_DEVICE_ONLY__
1331-
constexpr detail::string_view Name{detail::getKernelName<NameT>()};
1332-
1333-
verifyUsedKernelBundleInternal(Name);
1334-
processProperties<detail::isKernelESIMD<NameT>(), PropertiesT>(Props);
1323+
verifyUsedKernelBundleInternal(Info.Name);
1324+
processProperties<Info.IsESIMD, PropertiesT>(Props);
13351325
detail::checkValueRange<Dims>(UserRange);
13361326
setNDRangeDescriptor(std::move(UserRange));
13371327
StoreLambda<NameT, KernelType, Dims, TransformedArgType>(
@@ -1414,8 +1404,8 @@ class __SYCL_EXPORT handler {
14141404
throwOnKernelParameterMisuse<KernelName, KernelType>();
14151405
}
14161406
throwIfActionIsCreated();
1417-
constexpr detail::string_view Name{detail::getKernelName<NameT>()};
1418-
verifyUsedKernelBundleInternal(Name);
1407+
constexpr auto Info = detail::CompileTimeKernelInfo<NameT>;
1408+
verifyUsedKernelBundleInternal(Info.Name);
14191409
setType(detail::CGType::Kernel);
14201410

14211411
detail::checkValueRange<Dims>(params...);
@@ -1427,7 +1417,7 @@ class __SYCL_EXPORT handler {
14271417
}
14281418

14291419
StoreLambda<NameT, KernelType, Dims, ElementType>(std::move(KernelFunc));
1430-
processProperties<detail::isKernelESIMD<NameT>(), PropertiesT>(Props);
1420+
processProperties<Info.IsESIMD, PropertiesT>(Props);
14311421
#endif
14321422
}
14331423

@@ -1460,8 +1450,8 @@ class __SYCL_EXPORT handler {
14601450
// Ignore any set kernel bundles and use the one associated with the
14611451
// kernel.
14621452
setHandlerKernelBundle(Kernel);
1463-
constexpr detail::string_view Name{detail::getKernelName<NameT>()};
1464-
verifyUsedKernelBundleInternal(Name);
1453+
constexpr auto Info = detail::CompileTimeKernelInfo<NameT>;
1454+
verifyUsedKernelBundleInternal(Info.Name);
14651455
setType(detail::CGType::Kernel);
14661456

14671457
detail::checkValueRange<Dims>(params...);
@@ -1479,7 +1469,7 @@ class __SYCL_EXPORT handler {
14791469
} else {
14801470
StoreLambda<NameT, KernelType, Dims, ElementType>(std::move(KernelFunc));
14811471
}
1482-
processProperties<detail::isKernelESIMD<NameT>(), PropertiesT>(Props);
1472+
processProperties<Info.IsESIMD, PropertiesT>(Props);
14831473
#endif
14841474
}
14851475
#endif // __INTEL_PREVIEW_BREAKING_CHANGES
@@ -1931,8 +1921,8 @@ class __SYCL_EXPORT handler {
19311921
detail::KernelWrapperHelperFuncs::kernel_single_task<NameT>(KernelFunc);
19321922
#ifndef __SYCL_DEVICE_ONLY__
19331923
throwIfActionIsCreated();
1934-
constexpr detail::string_view Name{detail::getKernelName<NameT>()};
1935-
verifyUsedKernelBundleInternal(Name);
1924+
constexpr auto Info = detail::CompileTimeKernelInfo<NameT>;
1925+
verifyUsedKernelBundleInternal(Info.Name);
19361926
// No need to check if range is out of INT_MAX limits as it's compile-time
19371927
// known constant
19381928
setNDRangeDescriptor(range<1>{1});
@@ -3560,8 +3550,8 @@ class __SYCL_EXPORT handler {
35603550
void throwOnKernelParameterMisuse() const {
35613551
using NameT =
35623552
typename detail::get_kernel_name_t<KernelName, KernelType>::name;
3563-
throwOnKernelParameterMisuseHelper(detail::getKernelNumParams<NameT>(),
3564-
&detail::getKernelParamDesc<NameT>);
3553+
constexpr auto Info = detail::CompileTimeKernelInfo<NameT>;
3554+
throwOnKernelParameterMisuseHelper(Info.NumParams, Info.ParamDescGetter);
35653555
}
35663556

35673557
template <typename T, int Dims, access::mode AccessMode,

sycl/include/sycl/kernel_bundle.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ template <typename KernelName> kernel_id get_kernel_id() {
624624
// FIXME: This must fail at link-time if KernelName not in any available
625625
// translation units.
626626
return detail::get_kernel_id_impl(
627-
detail::string_view{detail::getKernelName<KernelName>()});
627+
detail::CompileTimeKernelInfo<KernelName>.Name);
628628
}
629629

630630
/// \returns a vector with all kernel_id's defined in the application

0 commit comments

Comments
 (0)