Skip to content

Commit 5995c61

Browse files
[SYCL][Level Zero] Implement sycl_ext_intel_cslice extension (#7626)
With this change, on PVC sub-sub-devices now require `info::partition_property::ext_intel_partition_by_cslice` instead of `info::partition_property::partition_by_affinity_domain` that wasn't quite accurately describing the actual scheme. The old behavior could be temporarily restored via `SYCL_PI_LEVEL_ZERO_EXPOSE_CSLICE_IN_AFFINITY_PARTITIONING` environment variable but it is immediately deprecated, and customers are encouraged to switch to the new partitioning scheme as soon as possible. However, even in this scenario, `sub_sub_device.get_info<info::device::partition_type_property>()` would return `info::partition_property::ext_intel_partition_by_cslice`. That is due to the fact that the whole device hierarchy is pre-populated in the plugin, and we don't know in advance what partitioning would be used in `get_sub_devices` call from SYCL RT. On other devices, CSlice-based partitioning is now disabled because that's not how the actual H/W works. If precise manual access to individual CCS is required than `sycl_ext_intel_queue_index` extension should be used instead. Extension specification is being added in #7513.
1 parent f37f942 commit 5995c61

File tree

13 files changed

+177
-52
lines changed

13 files changed

+177
-52
lines changed

sycl/doc/EnvironmentVariables.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ variables in production code.</span>
249249
| `SYCL_PI_LEVEL_ZERO_USE_COPY_ENGINE_FOR_FILL` | Integer | When set to a positive value enables use of a copy engine for memory fill operations. Default is 0. |
250250
| `SYCL_PI_LEVEL_ZERO_SINGLE_ROOT_DEVICE_BUFFER_MIGRATION` | Integer | When set to "0" tells to use single root-device allocation for all devices in a context where all devices have same root. Otherwise performs regular buffer migration. Default is 1. |
251251
| `SYCL_PI_LEVEL_ZERO_REUSE_DISCARDED_EVENTS` | Integer | When set to a positive value enables the mode when discarded Level Zero events are reset and reused in scope of the same in-order queue based on the dependency chain between commands. Default is 1. |
252+
| `SYCL_PI_LEVEL_ZERO_EXPOSE_CSLICE_IN_AFFINITY_PARTITIONING` (Deprecated) | Integer | When set to non-zero value exposes compute slices as sub-sub-devices in `sycl::info::partition_property::partition_by_affinity_domain` partitioning scheme. Default is zero meaning that they are only exposed when partitioning by `sycl::info::partition_property::ext_intel_partition_by_cslice`. This option is introduced for compatibility reasons and is immediately deprecated. New code must not rely on this behavior. Also note that even if sub-sub-device was created using `partition_by_affinity_domain` it would still be reported as created via partitioning by compute slices. |
252253

253254
## Debugging variables for CUDA Plugin
254255

sycl/doc/extensions/proposed/sycl_ext_intel_cslice.asciidoc renamed to sycl/doc/extensions/supported/sycl_ext_intel_cslice.asciidoc

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,7 @@ SYCL specification refer to that revision.
4343

4444
== Status
4545

46-
This is a proposed extension specification, intended to gather community
47-
feedback. Interfaces defined in this specification may not be implemented yet
48-
or may be in a preliminary state. The specification itself may also change in
49-
incompatible ways before it is finalized. *Shipping software products should
50-
not rely on APIs defined in this specification.*
46+
This extension is implemented and fully supported by DPC++.
5147

5248

5349
== Overview

sycl/include/sycl/detail/pi.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,14 @@
6060
// PI_EXT_ONEAPI_QUEUE_PRIORITY_HIGH queue properties.
6161
// 11.18 Add new parameter name PI_EXT_ONEAPI_QUEUE_INFO_EMPTY to
6262
// _pi_queue_info.
63+
// 12.19 Add new PI_EXT_INTEL_DEVICE_PARTITION_BY_CSLICE piDevicePartition
64+
// scheme. Sub-sub-devices (representing compute slice) creation via
65+
// partitioning by affinity domain is disabled by default and can be temporarily
66+
// restored via SYCL_PI_LEVEL_ZERO_EXPOSE_CSLICE_IN_AFFINITY_PARTITIONING
67+
// environment variable.
6368

64-
#define _PI_H_VERSION_MAJOR 11
65-
#define _PI_H_VERSION_MINOR 18
69+
#define _PI_H_VERSION_MAJOR 12
70+
#define _PI_H_VERSION_MINOR 19
6671

6772
#define _PI_STRING_HELPER(a) #a
6873
#define _PI_CONCAT(a, b) _PI_STRING_HELPER(a.b)
@@ -630,6 +635,8 @@ static constexpr pi_device_partition_property
630635
PI_DEVICE_PARTITION_BY_COUNTS_LIST_END = 0x0;
631636
static constexpr pi_device_partition_property
632637
PI_DEVICE_PARTITION_BY_AFFINITY_DOMAIN = 0x1088;
638+
static constexpr pi_device_partition_property
639+
PI_EXT_INTEL_DEVICE_PARTITION_BY_CSLICE = 0x1089;
633640

634641
// For compatibility with OpenCL define this not as enum.
635642
using pi_device_affinity_domain = pi_bitfield;

sycl/include/sycl/device.hpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,19 @@ class __SYCL_EXPORT device : public detail::OwnerLessBase<device> {
174174
std::vector<device>
175175
create_sub_devices(info::partition_affinity_domain AffinityDomain) const;
176176

177+
/// Partition device into sub devices
178+
///
179+
/// Available only when prop is
180+
/// info::partition_property::ext_intel_partition_by_cslice. If this SYCL
181+
/// device does not support
182+
/// info::partition_property::ext_intel_partition_by_cslice a
183+
/// feature_not_supported exception must be thrown.
184+
///
185+
/// \return a vector class of sub devices partitioned from this SYCL
186+
/// device at a granularity of "cslice" (compute slice).
187+
template <info::partition_property prop>
188+
std::vector<device> create_sub_devices() const;
189+
177190
/// Queries this SYCL device for information requested by the template
178191
/// parameter param
179192
///

sycl/include/sycl/info/info_desc.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ enum class partition_property : pi_device_partition_property {
5555
no_partition = 0,
5656
partition_equally = PI_DEVICE_PARTITION_EQUALLY,
5757
partition_by_counts = PI_DEVICE_PARTITION_BY_COUNTS,
58-
partition_by_affinity_domain = PI_DEVICE_PARTITION_BY_AFFINITY_DOMAIN
58+
partition_by_affinity_domain = PI_DEVICE_PARTITION_BY_AFFINITY_DOMAIN,
59+
ext_intel_partition_by_cslice = PI_EXT_INTEL_DEVICE_PARTITION_BY_CSLICE
5960
};
6061

6162
enum class partition_affinity_domain : pi_device_affinity_domain {

sycl/plugins/level_zero/pi_level_zero.cpp

Lines changed: 100 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,12 @@ static const int DeviceEventsSetting = [] {
170170
return AllHostVisible;
171171
}();
172172

173+
static const bool ExposeCSliceInAffinityPartitioning = [] {
174+
const char *Flag =
175+
std::getenv("SYCL_PI_LEVEL_ZERO_EXPOSE_CSLICE_IN_AFFINITY_PARTITIONING");
176+
return Flag ? std::atoi(Flag) != 0 : false;
177+
}();
178+
173179
// Helper function to implement zeHostSynchronize.
174180
// The behavior is to avoid infinite wait during host sync under ZE_DEBUG.
175181
// This allows for a much more responsive debugging of hangs.
@@ -2606,28 +2612,33 @@ pi_result _pi_platform::populateDeviceCacheIfNeeded() {
26062612
}
26072613
}
26082614

2609-
// Create PI sub-sub-devices with the sub-device for all the ordinals.
2610-
// Each {ordinal, index} points to a specific CCS which constructs
2611-
// a sub-sub-device at this point.
2612-
// FIXME: Level Zero creates multiple PiDevices for a single physical
2613-
// device when sub-device is partitioned into sub-sub-devices.
2614-
// Sub-sub-device is technically a command queue and we should not build
2615-
// program for each command queue. PiDevice is probably not the right
2616-
// abstraction for a Level Zero command queue.
2617-
for (uint32_t J = 0; J < Ordinals.size(); ++J) {
2618-
for (uint32_t K = 0; K < QueueGroupProperties[Ordinals[J]].numQueues;
2619-
++K) {
2620-
std::unique_ptr<_pi_device> PiSubSubDevice(
2621-
new _pi_device(ZeSubdevices[I], this, PiSubDevice.get()));
2622-
pi_result Result = PiSubSubDevice->initialize(Ordinals[J], K);
2623-
if (Result != PI_SUCCESS) {
2624-
return Result;
2615+
// If isn't PVC, then submissions to different CCS can be executed on
2616+
// the same EUs still, so we cannot treat them as sub-sub-devices.
2617+
if (PiSubDevice->isPVC() || ExposeCSliceInAffinityPartitioning) {
2618+
// Create PI sub-sub-devices with the sub-device for all the ordinals.
2619+
// Each {ordinal, index} points to a specific CCS which constructs
2620+
// a sub-sub-device at this point.
2621+
//
2622+
// FIXME: Level Zero creates multiple PiDevices for a single physical
2623+
// device when sub-device is partitioned into sub-sub-devices.
2624+
// Sub-sub-device is technically a command queue and we should not
2625+
// build program for each command queue. PiDevice is probably not the
2626+
// right abstraction for a Level Zero command queue.
2627+
for (uint32_t J = 0; J < Ordinals.size(); ++J) {
2628+
for (uint32_t K = 0;
2629+
K < QueueGroupProperties[Ordinals[J]].numQueues; ++K) {
2630+
std::unique_ptr<_pi_device> PiSubSubDevice(
2631+
new _pi_device(ZeSubdevices[I], this, PiSubDevice.get()));
2632+
pi_result Result = PiSubSubDevice->initialize(Ordinals[J], K);
2633+
if (Result != PI_SUCCESS) {
2634+
return Result;
2635+
}
2636+
2637+
// save pointers to sub-sub-devices for quick retrieval in the
2638+
// future.
2639+
PiSubDevice->SubDevices.push_back(PiSubSubDevice.get());
2640+
PiDevicesCache.push_back(std::move(PiSubSubDevice));
26252641
}
2626-
2627-
// save pointers to sub-sub-devices for quick retrieval in the
2628-
// future.
2629-
PiSubDevice->SubDevices.push_back(PiSubSubDevice.get());
2630-
PiDevicesCache.push_back(std::move(PiSubSubDevice));
26312642
}
26322643
}
26332644

@@ -2868,31 +2879,49 @@ pi_result piDeviceGetInfo(pi_device Device, pi_device_info ParamName,
28682879
if (ZeSubDeviceCount < 2) {
28692880
return ReturnValue(pi_device_partition_property{0});
28702881
}
2871-
// It is debatable if SYCL sub-device and partitioning APIs sufficient to
2872-
// expose Level Zero sub-devices? We start with support of
2873-
// "partition_by_affinity_domain" and "next_partitionable" but if that
2874-
// doesn't seem to be a good fit we could look at adding a more descriptive
2875-
// partitioning type.
2876-
struct {
2877-
pi_device_partition_property Arr[2];
2878-
} PartitionProperties = {{PI_DEVICE_PARTITION_BY_AFFINITY_DOMAIN, 0}};
2879-
return ReturnValue(PartitionProperties);
2882+
bool PartitionedByCSlice = Device->SubDevices[0]->isCCS();
2883+
2884+
auto ReturnHelper = [&](auto... Partitions) {
2885+
struct {
2886+
pi_device_partition_property Arr[sizeof...(Partitions) + 1];
2887+
} PartitionProperties = {{Partitions..., 0}};
2888+
return ReturnValue(PartitionProperties);
2889+
};
2890+
2891+
if (ExposeCSliceInAffinityPartitioning) {
2892+
if (PartitionedByCSlice)
2893+
return ReturnHelper(PI_EXT_INTEL_DEVICE_PARTITION_BY_CSLICE,
2894+
PI_DEVICE_PARTITION_BY_AFFINITY_DOMAIN);
2895+
2896+
else
2897+
return ReturnHelper(PI_DEVICE_PARTITION_BY_AFFINITY_DOMAIN);
2898+
} else {
2899+
return ReturnHelper(PartitionedByCSlice
2900+
? PI_EXT_INTEL_DEVICE_PARTITION_BY_CSLICE
2901+
: PI_DEVICE_PARTITION_BY_AFFINITY_DOMAIN);
2902+
}
28802903
}
28812904
case PI_DEVICE_INFO_PARTITION_AFFINITY_DOMAIN:
28822905
return ReturnValue(pi_device_affinity_domain{
28832906
PI_DEVICE_AFFINITY_DOMAIN_NUMA |
28842907
PI_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE});
28852908
case PI_DEVICE_INFO_PARTITION_TYPE: {
2886-
if (Device->isSubDevice()) {
2909+
// For root-device there is no partitioning to report.
2910+
if (!Device->isSubDevice())
2911+
return ReturnValue(pi_device_partition_property{0});
2912+
2913+
if (Device->isCCS()) {
28872914
struct {
2888-
pi_device_partition_property Arr[3];
2889-
} PartitionProperties = {{PI_DEVICE_PARTITION_BY_AFFINITY_DOMAIN,
2890-
PI_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE,
2891-
0}};
2915+
pi_device_partition_property Arr[2];
2916+
} PartitionProperties = {{PI_EXT_INTEL_DEVICE_PARTITION_BY_CSLICE, 0}};
28922917
return ReturnValue(PartitionProperties);
28932918
}
2894-
// For root-device there is no partitioning to report.
2895-
return ReturnValue(pi_device_partition_property{0});
2919+
2920+
struct {
2921+
pi_device_partition_property Arr[3];
2922+
} PartitionProperties = {{PI_DEVICE_PARTITION_BY_AFFINITY_DOMAIN,
2923+
PI_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE, 0}};
2924+
return ReturnValue(PartitionProperties);
28962925
}
28972926

28982927
// Everything under here is not supported yet
@@ -3264,15 +3293,19 @@ pi_result piDevicePartition(pi_device Device,
32643293
const pi_device_partition_property *Properties,
32653294
pi_uint32 NumDevices, pi_device *OutDevices,
32663295
pi_uint32 *OutNumDevices) {
3296+
PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
32673297
// Other partitioning ways are not supported by Level Zero
3268-
if (Properties[0] != PI_DEVICE_PARTITION_BY_AFFINITY_DOMAIN ||
3269-
(Properties[1] != PI_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE &&
3270-
Properties[1] != PI_DEVICE_AFFINITY_DOMAIN_NUMA)) {
3298+
if (Properties[0] == PI_DEVICE_PARTITION_BY_AFFINITY_DOMAIN) {
3299+
if ((Properties[1] != PI_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE &&
3300+
Properties[1] != PI_DEVICE_AFFINITY_DOMAIN_NUMA))
3301+
return PI_ERROR_INVALID_VALUE;
3302+
} else if (Properties[0] == PI_EXT_INTEL_DEVICE_PARTITION_BY_CSLICE) {
3303+
if (Properties[1] != 0)
3304+
return PI_ERROR_INVALID_VALUE;
3305+
} else {
32713306
return PI_ERROR_INVALID_VALUE;
32723307
}
32733308

3274-
PI_ASSERT(Device, PI_ERROR_INVALID_DEVICE);
3275-
32763309
// Devices cache is normally created in piDevicesGet but still make
32773310
// sure that cache is populated.
32783311
//
@@ -3281,16 +3314,39 @@ pi_result piDevicePartition(pi_device Device,
32813314
return Res;
32823315
}
32833316

3317+
auto EffectiveNumDevices = [&]() -> decltype(Device->SubDevices.size()) {
3318+
if (Device->SubDevices.size() == 0)
3319+
return 0;
3320+
3321+
// Sub-Sub-Devices are partitioned by CSlices, not by affinity domain.
3322+
// However, if
3323+
// SYCL_PI_LEVEL_ZERO_EXPOSE_CSLICE_IN_AFFINITY_PARTITIONING overrides that
3324+
// still expose CSlices in partitioning by affinity domain for compatibility
3325+
// reasons.
3326+
if (Properties[0] == PI_DEVICE_PARTITION_BY_AFFINITY_DOMAIN &&
3327+
!ExposeCSliceInAffinityPartitioning) {
3328+
if (Device->isSubDevice())
3329+
return 0;
3330+
}
3331+
if (Properties[0] == PI_EXT_INTEL_DEVICE_PARTITION_BY_CSLICE) {
3332+
// Not a CSlice-based partitioning.
3333+
if (!Device->SubDevices[0]->isCCS())
3334+
return 0;
3335+
}
3336+
3337+
return Device->SubDevices.size();
3338+
}();
3339+
32843340
if (OutNumDevices) {
3285-
*OutNumDevices = Device->SubDevices.size();
3341+
*OutNumDevices = EffectiveNumDevices;
32863342
}
32873343

32883344
if (OutDevices) {
32893345
// TODO: Consider support for partitioning to <= total sub-devices.
32903346
// Currently supported partitioning (by affinity domain/numa) would always
32913347
// partition to all sub-devices.
32923348
//
3293-
PI_ASSERT(NumDevices == Device->SubDevices.size(), PI_ERROR_INVALID_VALUE);
3349+
PI_ASSERT(NumDevices == EffectiveNumDevices, PI_ERROR_INVALID_VALUE);
32943350

32953351
for (uint32_t I = 0; I < NumDevices; I++) {
32963352
OutDevices[I] = Device->SubDevices[I];

sycl/plugins/level_zero/pi_level_zero.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,14 @@ struct _pi_device : _pi_object {
379379

380380
bool isSubDevice() { return RootDevice != nullptr; }
381381

382+
// Is this a Data Center GPU Max series (aka PVC).
383+
bool isPVC() { return (ZeDeviceProperties->deviceId & 0xff0) == 0xbd0; }
384+
385+
// Does this device represent a single compute slice?
386+
bool isCCS() const {
387+
return QueueGroup[_pi_device::queue_group_info_t::Compute].ZeIndex >= 0;
388+
}
389+
382390
// Cache of the immutable device properties.
383391
ZeCache<ZeStruct<ze_device_properties_t>> ZeDeviceProperties;
384392
ZeCache<ZeStruct<ze_device_compute_properties_t>> ZeDeviceComputeProperties;

sycl/source/detail/device_impl.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,28 @@ std::vector<device> device_impl::create_sub_devices(
250250
return create_sub_devices(Properties, SubDevicesCount);
251251
}
252252

253+
std::vector<device> device_impl::create_sub_devices() const {
254+
assert(!MIsHostDevice && "Partitioning is not supported on host.");
255+
256+
if (!is_partition_supported(
257+
info::partition_property::ext_intel_partition_by_cslice)) {
258+
throw sycl::feature_not_supported(
259+
"Device does not support "
260+
"sycl::info::partition_property::ext_intel_partition_by_cslice.",
261+
PI_ERROR_INVALID_OPERATION);
262+
}
263+
264+
const pi_device_partition_property Properties[2] = {
265+
PI_EXT_INTEL_DEVICE_PARTITION_BY_CSLICE, 0};
266+
267+
pi_uint32 SubDevicesCount = 0;
268+
const detail::plugin &Plugin = getPlugin();
269+
Plugin.call<sycl::errc::invalid, PiApiKind::piDevicePartition>(
270+
MDevice, Properties, 0, nullptr, &SubDevicesCount);
271+
272+
return create_sub_devices(Properties, SubDevicesCount);
273+
}
274+
253275
pi_native_handle device_impl::getNative() const {
254276
auto Plugin = getPlugin();
255277
if (Plugin.getBackend() == backend::opencl)

sycl/source/detail/device_impl.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,16 @@ class device_impl {
172172
std::vector<device>
173173
create_sub_devices(info::partition_affinity_domain AffinityDomain) const;
174174

175+
/// Partition device into sub devices
176+
///
177+
/// If this SYCL device does not support
178+
/// info::partition_property::ext_intel_partition_by_cslice a
179+
/// feature_not_supported exception must be thrown.
180+
///
181+
/// \return a vector class of sub devices partitioned from this SYCL
182+
/// device at a granularity of "cslice" (compute slice).
183+
std::vector<device> create_sub_devices() const;
184+
175185
/// Check if desired partition property supported by device
176186
///
177187
/// \param Prop is one of info::partition_property::(partition_equally,

sycl/source/detail/device_info.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,7 @@ static bool is_sycl_partition_property(info::partition_property PP) {
358358
case info::partition_property::partition_equally:
359359
case info::partition_property::partition_by_counts:
360360
case info::partition_property::partition_by_affinity_domain:
361+
case info::partition_property::ext_intel_partition_by_cslice:
361362
return true;
362363
}
363364
return false;

sycl/source/device.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,14 @@ template __SYCL_EXPORT std::vector<device> device::create_sub_devices<
117117
info::partition_property::partition_by_affinity_domain>(
118118
info::partition_affinity_domain AffinityDomain) const;
119119

120+
template <info::partition_property prop>
121+
std::vector<device> device::create_sub_devices() const {
122+
return impl->create_sub_devices();
123+
}
124+
125+
template __SYCL_EXPORT std::vector<device> device::create_sub_devices<
126+
info::partition_property::ext_intel_partition_by_cslice>() const;
127+
120128
bool device::has_extension(const std::string &extension_name) const {
121129
return impl->has_extension(extension_name);
122130
}

sycl/test/abi/sycl_symbols_linux.dump

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4175,6 +4175,7 @@ _ZNK4sycl3_V16device14is_acceleratorEv
41754175
_ZNK4sycl3_V16device18create_sub_devicesILNS0_4info18partition_propertyE4230EEESt6vectorIS1_SaIS1_EEm
41764176
_ZNK4sycl3_V16device18create_sub_devicesILNS0_4info18partition_propertyE4231EEESt6vectorIS1_SaIS1_EERKS5_ImSaImEE
41774177
_ZNK4sycl3_V16device18create_sub_devicesILNS0_4info18partition_propertyE4232EEESt6vectorIS1_SaIS1_EENS3_25partition_affinity_domainE
4178+
_ZNK4sycl3_V16device18create_sub_devicesILNS0_4info18partition_propertyE4233EEESt6vectorIS1_SaIS1_EEv
41784179
_ZNK4sycl3_V16device3getEv
41794180
_ZNK4sycl3_V16device3hasENS0_6aspectE
41804181
_ZNK4sycl3_V16device6is_cpuEv

sycl/test/abi/sycl_symbols_windows.dump

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
??$create_sub_devices@$0BAIG@@device@_V1@sycl@@QEBA?AV?$vector@Vdevice@_V1@sycl@@V?$allocator@Vdevice@_V1@sycl@@@std@@@std@@_K@Z
1313
??$create_sub_devices@$0BAIH@@device@_V1@sycl@@QEBA?AV?$vector@Vdevice@_V1@sycl@@V?$allocator@Vdevice@_V1@sycl@@@std@@@std@@AEBV?$vector@_KV?$allocator@_K@std@@@4@@Z
1414
??$create_sub_devices@$0BAII@@device@_V1@sycl@@QEBA?AV?$vector@Vdevice@_V1@sycl@@V?$allocator@Vdevice@_V1@sycl@@@std@@@std@@W4partition_affinity_domain@info@12@@Z
15+
??$create_sub_devices@$0BAIJ@@device@_V1@sycl@@QEBA?AV?$vector@Vdevice@_V1@sycl@@V?$allocator@Vdevice@_V1@sycl@@@std@@@std@@XZ
1516
??$getPlugin@$00@pi@detail@_V1@sycl@@YAAEBVplugin@123@XZ
1617
??$getPlugin@$01@pi@detail@_V1@sycl@@YAAEBVplugin@123@XZ
1718
??$getPlugin@$02@pi@detail@_V1@sycl@@YAAEBVplugin@123@XZ

0 commit comments

Comments
 (0)