Skip to content

Commit 13443a9

Browse files
[SYCL] Fix kernel bundles don't really carry kernel IDs (#5121)
Fix that interop kernel bundles don't really carry kernel IDs for contained kernels. This change adds In enqueueImpKernel another condition to taking the path using the associated kernel_bundle, namely that interop bundles can't be used in the first branch. (This is because the kernels in interop kernel bundles (if any) do not have kernel_id and can therefore not be looked up, but since they are self-contained they can simply be launched directly.)
1 parent 2d62e51 commit 13443a9

File tree

7 files changed

+52
-20
lines changed

7 files changed

+52
-20
lines changed

sycl/include/CL/sycl/kernel_bundle.hpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,21 @@ using DevImgSelectorImpl =
471471
__SYCL_EXPORT detail::KernelBundleImplPtr
472472
get_kernel_bundle_impl(const context &Ctx, const std::vector<device> &Devs,
473473
bundle_state State, const DevImgSelectorImpl &Selector);
474+
475+
// Internal non-template versions of get_empty_interop_kernel_bundle API which
476+
// is used by public onces
477+
__SYCL_EXPORT detail::KernelBundleImplPtr
478+
get_empty_interop_kernel_bundle_impl(const context &Ctx,
479+
const std::vector<device> &Devs);
480+
481+
/// make_kernel may need an empty interop kernel bundle. This function supplies
482+
/// this.
483+
template <bundle_state State>
484+
kernel_bundle<State> get_empty_interop_kernel_bundle(const context &Ctx) {
485+
detail::KernelBundleImplPtr Impl =
486+
detail::get_empty_interop_kernel_bundle_impl(Ctx, Ctx.get_devices());
487+
return detail::createSyclObjFromImpl<sycl::kernel_bundle<State>>(Impl);
488+
}
474489
} // namespace detail
475490

476491
/// A kernel bundle in state State which contains all of the device images for

sycl/source/backend.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -246,10 +246,10 @@ kernel make_kernel(const context &TargetContext,
246246

247247
kernel make_kernel(pi_native_handle NativeHandle, const context &TargetContext,
248248
backend Backend) {
249-
return make_kernel(TargetContext,
250-
get_kernel_bundle<bundle_state::executable>(
251-
TargetContext, std::vector<kernel_id>{}),
252-
NativeHandle, false, Backend);
249+
return make_kernel(
250+
TargetContext,
251+
get_empty_interop_kernel_bundle<bundle_state::executable>(TargetContext),
252+
NativeHandle, false, Backend);
253253
}
254254

255255
} // namespace detail

sycl/source/detail/kernel_bundle_impl.hpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,19 +87,24 @@ class kernel_bundle_impl {
8787
MContext, MDevices, State);
8888
}
8989

90-
// Interop constructor
91-
kernel_bundle_impl(context Ctx, std::vector<device> Devs,
92-
device_image_plain &DevImage)
90+
// Interop constructor used by make_kernel
91+
kernel_bundle_impl(context Ctx, std::vector<device> Devs)
9392
: MContext(Ctx), MDevices(Devs) {
9493
if (!checkAllDevicesAreInContext(Devs, Ctx))
9594
throw sycl::exception(
9695
make_error_code(errc::invalid),
9796
"Not all devices are associated with the context or "
9897
"vector of devices is empty");
99-
MDeviceImages.push_back(DevImage);
10098
MIsInterop = true;
10199
}
102100

101+
// Interop constructor
102+
kernel_bundle_impl(context Ctx, std::vector<device> Devs,
103+
device_image_plain &DevImage)
104+
: kernel_bundle_impl(Ctx, Devs) {
105+
MDeviceImages.push_back(DevImage);
106+
}
107+
103108
// Matches sycl::build and sycl::compile
104109
// Have one constructor because sycl::build and sycl::compile have the same
105110
// signature
@@ -476,6 +481,9 @@ class kernel_bundle_impl {
476481
size_t size() const noexcept { return MDeviceImages.size(); }
477482

478483
bundle_state get_bundle_state() const {
484+
// Interop kernel-bundles are always in executable state
485+
if (MIsInterop)
486+
return bundle_state::executable;
479487
// All device images are expected to have the same state
480488
return MDeviceImages.empty()
481489
? bundle_state::input

sycl/source/detail/scheduler/commands.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1922,15 +1922,16 @@ cl_int enqueueImpKernel(
19221922
std::shared_ptr<kernel_impl> SyclKernelImpl;
19231923
std::shared_ptr<device_image_impl> DeviceImageImpl;
19241924

1925-
// Use kernel_bundle is available
1926-
if (KernelBundleImplPtr) {
1927-
1928-
std::shared_ptr<kernel_id_impl> KernelIDImpl =
1929-
std::make_shared<kernel_id_impl>(KernelName);
1930-
1931-
kernel SyclKernel = KernelBundleImplPtr->get_kernel(
1932-
detail::createSyclObjFromImpl<kernel_id>(KernelIDImpl),
1933-
KernelBundleImplPtr);
1925+
// Use kernel_bundle if available unless it is interop.
1926+
// Interop bundles can't be used in the first branch, because the kernels
1927+
// in interop kernel bundles (if any) do not have kernel_id
1928+
// and can therefore not be looked up, but since they are self-contained
1929+
// they can simply be launched directly.
1930+
if (KernelBundleImplPtr && !KernelBundleImplPtr->isInterop()) {
1931+
kernel_id KernelID =
1932+
detail::ProgramManager::getInstance().getSYCLKernelID(KernelName);
1933+
kernel SyclKernel =
1934+
KernelBundleImplPtr->get_kernel(KernelID, KernelBundleImplPtr);
19341935

19351936
SyclKernelImpl = detail::getSyclObjImpl(SyclKernel);
19361937

sycl/source/kernel_bundle.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,12 @@ get_kernel_bundle_impl(const context &Ctx, const std::vector<device> &Devs,
138138
State);
139139
}
140140

141+
detail::KernelBundleImplPtr
142+
get_empty_interop_kernel_bundle_impl(const context &Ctx,
143+
const std::vector<device> &Devs) {
144+
return std::make_shared<detail::kernel_bundle_impl>(Ctx, Devs);
145+
}
146+
141147
std::shared_ptr<detail::kernel_bundle_impl>
142148
join_impl(const std::vector<detail::KernelBundleImplPtr> &Bundles) {
143149
return std::make_shared<detail::kernel_bundle_impl>(Bundles);

sycl/test/abi/sycl_symbols_linux.dump

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3891,6 +3891,7 @@ _ZN2cl4sycl6detail2pi9assertionEbPKc
38913891
_ZN2cl4sycl6detail2pi9getPluginILNS0_7backendE1EEERKNS1_6pluginEv
38923892
_ZN2cl4sycl6detail2pi9getPluginILNS0_7backendE2EEERKNS1_6pluginEv
38933893
_ZN2cl4sycl6detail2pi9getPluginILNS0_7backendE5EEERKNS1_6pluginEv
3894+
_ZN2cl4sycl6detail36get_empty_interop_kernel_bundle_implERKNS0_7contextERKSt6vectorINS0_6deviceESaIS6_EE
38943895
_ZN2cl4sycl6detail6OSUtil10getDirNameB5cxx11EPKc
38953896
_ZN2cl4sycl6detail6OSUtil11alignedFreeEPv
38963897
_ZN2cl4sycl6detail6OSUtil12alignedAllocEmm
@@ -4243,7 +4244,6 @@ _ZNK2cl4sycl6kernel11get_backendEv
42434244
_ZNK2cl4sycl6kernel11get_contextEv
42444245
_ZNK2cl4sycl6kernel11get_programEv
42454246
_ZNK2cl4sycl6kernel13getNativeImplEv
4246-
_ZNK2cl4sycl6kernel9getNativeEv
42474247
_ZNK2cl4sycl6kernel17get_kernel_bundleEv
42484248
_ZNK2cl4sycl6kernel18get_sub_group_infoILNS0_4info16kernel_sub_groupE16650EEENS3_12param_traitsIS4_XT_EE11return_typeERKNS0_6deviceE
42494249
_ZNK2cl4sycl6kernel18get_sub_group_infoILNS0_4info16kernel_sub_groupE4537EEENS3_12param_traitsIS4_XT_EE11return_typeERKNS0_6deviceE
@@ -4272,6 +4272,7 @@ _ZNK2cl4sycl6kernel8get_infoILNS0_4info6kernelE4498EEENS3_12param_traitsIS4_XT_E
42724272
_ZNK2cl4sycl6kernel8get_infoILNS0_4info6kernelE4499EEENS3_12param_traitsIS4_XT_EE11return_typeEv
42734273
_ZNK2cl4sycl6kernel8get_infoILNS0_4info6kernelE4500EEENS3_12param_traitsIS4_XT_EE11return_typeEv
42744274
_ZNK2cl4sycl6kernel8get_infoILNS0_4info6kernelE4501EEENS3_12param_traitsIS4_XT_EE11return_typeEv
4275+
_ZNK2cl4sycl6kernel9getNativeEv
42754276
_ZNK2cl4sycl6stream22get_max_statement_sizeEv
42764277
_ZNK2cl4sycl6stream8get_sizeEv
42774278
_ZNK2cl4sycl6streameqERKS1_

sycl/test/abi/sycl_symbols_windows.dump

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1873,7 +1873,6 @@
18731873
?fill_usm@MemoryManager@detail@sycl@cl@@SAXPEAXV?$shared_ptr@Vqueue_impl@detail@sycl@cl@@@std@@_KHV?$vector@PEAU_pi_event@@V?$allocator@PEAU_pi_event@@@std@@@6@AEAPEAU_pi_event@@@Z
18741874
?fill_usm@MemoryManager@detail@sycl@cl@@SAXPEAXV?$shared_ptr@Vqueue_impl@detail@sycl@cl@@@std@@_KHV?$vector@PEAU_pi_event@@V?$allocator@PEAU_pi_event@@@std@@@6@PEAPEAU_pi_event@@@Z
18751875
?finalize@handler@sycl@cl@@AEAA?AVevent@23@XZ
1876-
?getESIMDDeviceInterface@detail@sycl@cl@@YAPEAUESIMDDeviceInterface@123@XZ
18771876
?find_device_intersection@detail@sycl@cl@@YA?AV?$vector@Vdevice@sycl@cl@@V?$allocator@Vdevice@sycl@cl@@@std@@@std@@AEBV?$vector@V?$kernel_bundle@$00@sycl@cl@@V?$allocator@V?$kernel_bundle@$00@sycl@cl@@@std@@@5@@Z
18781877
?floor@__host_std@cl@@YA?AV?$vec@M$00@sycl@2@V342@@Z
18791878
?floor@__host_std@cl@@YA?AV?$vec@M$01@sycl@2@V342@@Z
@@ -2094,6 +2093,7 @@
20942093
?getDevices@?$image_impl@$01@detail@sycl@cl@@AEAA?AV?$vector@Vdevice@sycl@cl@@V?$allocator@Vdevice@sycl@cl@@@std@@@std@@V?$shared_ptr@Vcontext_impl@detail@sycl@cl@@@6@@Z
20952094
?getDevices@?$image_impl@$02@detail@sycl@cl@@AEAA?AV?$vector@Vdevice@sycl@cl@@V?$allocator@Vdevice@sycl@cl@@@std@@@std@@V?$shared_ptr@Vcontext_impl@detail@sycl@cl@@@6@@Z
20962095
?getDirName@OSUtil@detail@sycl@cl@@SA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PEBD@Z
2096+
?getESIMDDeviceInterface@detail@sycl@cl@@YAPEAUESIMDDeviceInterface@123@XZ
20972097
?getElementSize@?$image_impl@$00@detail@sycl@cl@@QEBA_KXZ
20982098
?getElementSize@?$image_impl@$01@detail@sycl@cl@@QEBA_KXZ
20992099
?getElementSize@?$image_impl@$02@detail@sycl@cl@@QEBA_KXZ
@@ -2116,13 +2116,13 @@
21162116
?getNative@device@sycl@cl@@AEBA_KXZ
21172117
?getNative@device_image_plain@detail@sycl@cl@@QEBA_KXZ
21182118
?getNative@event@sycl@cl@@AEBA_KXZ
2119+
?getNative@kernel@sycl@cl@@AEBA_KXZ
21192120
?getNative@platform@sycl@cl@@AEBA_KXZ
21202121
?getNative@program@sycl@cl@@AEBA_KXZ
21212122
?getNative@queue@sycl@cl@@AEBA_KXZ
21222123
?getNativeContext@interop_handle@sycl@cl@@AEBA_KXZ
21232124
?getNativeDevice@interop_handle@sycl@cl@@AEBA_KXZ
21242125
?getNativeImpl@kernel@sycl@cl@@AEBA_KXZ
2125-
?getNative@kernel@sycl@cl@@AEBA_KXZ
21262126
?getNativeMem@interop_handle@sycl@cl@@AEBA_KPEAVAccessorImplHost@detail@23@@Z
21272127
?getNativeQueue@interop_handle@sycl@cl@@AEBA_KXZ
21282128
?getOSMemSize@OSUtil@detail@sycl@cl@@SA_KXZ
@@ -2180,6 +2180,7 @@
21802180
?get_devices@kernel_bundle_plain@detail@sycl@cl@@QEBA?AV?$vector@Vdevice@sycl@cl@@V?$allocator@Vdevice@sycl@cl@@@std@@@std@@XZ
21812181
?get_devices@platform@sycl@cl@@QEBA?AV?$vector@Vdevice@sycl@cl@@V?$allocator@Vdevice@sycl@cl@@@std@@@std@@W4device_type@info@23@@Z
21822182
?get_devices@program@sycl@cl@@QEBA?AV?$vector@Vdevice@sycl@cl@@V?$allocator@Vdevice@sycl@cl@@@std@@@std@@XZ
2183+
?get_empty_interop_kernel_bundle_impl@detail@sycl@cl@@YA?AV?$shared_ptr@Vkernel_bundle_impl@detail@sycl@cl@@@std@@AEBVcontext@23@AEBV?$vector@Vdevice@sycl@cl@@V?$allocator@Vdevice@sycl@cl@@@std@@@5@@Z
21832184
?get_filtering_mode@sampler@sycl@cl@@QEBA?AW4filtering_mode@23@XZ
21842185
?get_filtering_mode@sampler_impl@detail@sycl@cl@@QEBA?AW4filtering_mode@34@XZ
21852186
?get_flags@stream@sycl@cl@@AEBAIXZ

0 commit comments

Comments
 (0)