Skip to content

Commit a6222ba

Browse files
[SYCL] Fix deprecation of device selectors (#6965)
Due to SYCL 1.2.1 device selectors being callable, they would fall into the SYCL 2020 interface rather than into the deprecated interfaces. To amend this, the trait for checking for callables has been changed to exclude subclasses of device_selector. Additionally this commit clarifies the deprecation messages to avoid capitalization of "Callable" and referencing the related SYCL specification versions for old and new interfaces. Signed-off-by: Larsen, Steffen <[email protected]>
1 parent b083e05 commit a6222ba

File tree

5 files changed

+119
-23
lines changed

5 files changed

+119
-23
lines changed

sycl/include/sycl/device.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ class __SYCL_EXPORT device {
6161
/// by the DeviceSelector provided.
6262
///
6363
/// \param DeviceSelector SYCL 1.2.1 device_selector to be used (see 4.6.1.1).
64-
__SYCL2020_DEPRECATED("Use Callable device selectors instead of deprecated "
65-
"device_selector subclasses.")
64+
__SYCL2020_DEPRECATED("SYCL 1.2.1 device selectors are deprecated. Please "
65+
"use SYCL 2020 device selectors instead.")
6666
explicit device(const device_selector &DeviceSelector);
6767

6868
#if __cplusplus >= 201703L
@@ -71,7 +71,8 @@ class __SYCL_EXPORT device {
7171
/// \param DeviceSelector is SYCL 2020 Device Selector, a simple callable that
7272
/// takes a device and returns an int
7373
template <typename DeviceSelector,
74-
typename = detail::EnableIfDeviceSelectorInvocable<DeviceSelector>>
74+
typename =
75+
detail::EnableIfSYCL2020DeviceSelectorInvocable<DeviceSelector>>
7576
explicit device(const DeviceSelector &deviceSelector)
7677
: device(detail::select_device(deviceSelector)) {}
7778
#endif

sycl/include/sycl/device_selector.hpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class filter_selector;
3232
///
3333
/// \ingroup sycl_api_dev_sel
3434
class __SYCL_EXPORT __SYCL2020_DEPRECATED(
35-
"Use Callable instead to select device.") device_selector {
35+
"Use SYCL 2020 callable device selectors instead.") device_selector {
3636

3737
public:
3838
virtual ~device_selector() = default;
@@ -120,12 +120,14 @@ using DSelectorInvocableType = std::function<int(const sycl::device &)>;
120120
#if __cplusplus >= 201703L
121121

122122
// Enable if DeviceSelector callable has matching signature, but
123-
// exclude if descended from filter_selector which is not purely callable.
123+
// exclude if descended from filter_selector which is not purely callable or
124+
// if descended from it is descended from SYCL 1.2.1 device_selector.
124125
// See [FilterSelector not Callable] in device_selector.cpp
125126
template <typename DeviceSelector>
126-
using EnableIfDeviceSelectorInvocable = std::enable_if_t<
127+
using EnableIfSYCL2020DeviceSelectorInvocable = std::enable_if_t<
127128
std::is_invocable_r_v<int, DeviceSelector &, const device &> &&
128-
!std::is_base_of_v<ext::oneapi::filter_selector, DeviceSelector>>;
129+
!std::is_base_of_v<ext::oneapi::filter_selector, DeviceSelector> &&
130+
!std::is_base_of_v<device_selector, DeviceSelector>>;
129131
#endif
130132

131133
__SYCL_EXPORT device

sycl/include/sycl/platform.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ class __SYCL_EXPORT platform {
6464
/// provided device selector.
6565
///
6666
/// \param DeviceSelector is an instance of a SYCL 1.2.1 device_selector
67-
__SYCL2020_DEPRECATED("Use Callable device selectors instead of deprecated "
68-
"device_selector subclasses.")
67+
__SYCL2020_DEPRECATED("SYCL 1.2.1 device selectors are deprecated. Please "
68+
"use SYCL 2020 device selectors instead.")
6969
explicit platform(const device_selector &DeviceSelector);
7070

7171
#if __cplusplus >= 201703L
@@ -74,7 +74,8 @@ class __SYCL_EXPORT platform {
7474
/// \param DeviceSelector is SYCL 2020 Device Selector, a simple callable that
7575
/// takes a device and returns an int
7676
template <typename DeviceSelector,
77-
typename = detail::EnableIfDeviceSelectorInvocable<DeviceSelector>>
77+
typename =
78+
detail::EnableIfSYCL2020DeviceSelectorInvocable<DeviceSelector>>
7879
explicit platform(const DeviceSelector &deviceSelector)
7980
: platform(detail::select_device(deviceSelector)) {}
8081
#endif

sycl/include/sycl/queue.hpp

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,8 @@ class __SYCL_EXPORT queue {
108108
/// \param AsyncHandler is a SYCL asynchronous exception handler.
109109
/// \param PropList is a list of properties for queue construction.
110110
template <typename DeviceSelector,
111-
typename = detail::EnableIfDeviceSelectorInvocable<DeviceSelector>>
111+
typename =
112+
detail::EnableIfSYCL2020DeviceSelectorInvocable<DeviceSelector>>
112113
explicit queue(const DeviceSelector &deviceSelector,
113114
const async_handler &AsyncHandler,
114115
const property_list &PropList = {})
@@ -120,7 +121,8 @@ class __SYCL_EXPORT queue {
120121
/// takes a device and returns an int
121122
/// \param PropList is a list of properties for queue construction.
122123
template <typename DeviceSelector,
123-
typename = detail::EnableIfDeviceSelectorInvocable<DeviceSelector>>
124+
typename =
125+
detail::EnableIfSYCL2020DeviceSelectorInvocable<DeviceSelector>>
124126
explicit queue(const DeviceSelector &deviceSelector,
125127
const property_list &PropList = {})
126128
: queue(detail::select_device(deviceSelector), async_handler{},
@@ -133,7 +135,8 @@ class __SYCL_EXPORT queue {
133135
/// takes a device and returns an int
134136
/// \param PropList is a list of properties for queue construction.
135137
template <typename DeviceSelector,
136-
typename = detail::EnableIfDeviceSelectorInvocable<DeviceSelector>>
138+
typename =
139+
detail::EnableIfSYCL2020DeviceSelectorInvocable<DeviceSelector>>
137140
explicit queue(const context &syclContext,
138141
const DeviceSelector &deviceSelector,
139142
const property_list &propList = {})
@@ -148,7 +151,8 @@ class __SYCL_EXPORT queue {
148151
/// \param AsyncHandler is a SYCL asynchronous exception handler.
149152
/// \param PropList is a list of properties for queue construction.
150153
template <typename DeviceSelector,
151-
typename = detail::EnableIfDeviceSelectorInvocable<DeviceSelector>>
154+
typename =
155+
detail::EnableIfSYCL2020DeviceSelectorInvocable<DeviceSelector>>
152156
explicit queue(const context &syclContext,
153157
const DeviceSelector &deviceSelector,
154158
const async_handler &AsyncHandler,
@@ -163,8 +167,8 @@ class __SYCL_EXPORT queue {
163167
///
164168
/// \param DeviceSelector is an instance of a SYCL 1.2.1 device_selector.
165169
/// \param PropList is a list of properties for queue construction.
166-
__SYCL2020_DEPRECATED("Use Callable device selectors instead of deprecated "
167-
"device_selector subclasses.")
170+
__SYCL2020_DEPRECATED("SYCL 1.2.1 device selectors are deprecated. Please "
171+
"use SYCL 2020 device selectors instead.")
168172
queue(const device_selector &DeviceSelector,
169173
const property_list &PropList = {})
170174
: queue(DeviceSelector.select_device(), async_handler{}, PropList) {}
@@ -175,8 +179,8 @@ class __SYCL_EXPORT queue {
175179
/// \param DeviceSelector is an instance of SYCL 1.2.1 device_selector.
176180
/// \param AsyncHandler is a SYCL asynchronous exception handler.
177181
/// \param PropList is a list of properties for queue construction.
178-
__SYCL2020_DEPRECATED("Use Callable device selectors instead of deprecated "
179-
"device_selector subclasses.")
182+
__SYCL2020_DEPRECATED("SYCL 1.2.1 device selectors are deprecated. Please "
183+
"use SYCL 2020 device selectors instead.")
180184
queue(const device_selector &DeviceSelector,
181185
const async_handler &AsyncHandler, const property_list &PropList = {})
182186
: queue(DeviceSelector.select_device(), AsyncHandler, PropList) {}
@@ -203,8 +207,8 @@ class __SYCL_EXPORT queue {
203207
/// \param SyclContext is an instance of SYCL context.
204208
/// \param DeviceSelector is an instance of SYCL device selector.
205209
/// \param PropList is a list of properties for queue construction.
206-
__SYCL2020_DEPRECATED("Use Callable device selectors instead of deprecated "
207-
"device_selector subclasses.")
210+
__SYCL2020_DEPRECATED("SYCL 1.2.1 device selectors are deprecated. Please "
211+
"use SYCL 2020 device selectors instead.")
208212
queue(const context &SyclContext, const device_selector &DeviceSelector,
209213
const property_list &PropList = {});
210214

@@ -216,8 +220,8 @@ class __SYCL_EXPORT queue {
216220
/// \param DeviceSelector is an instance of SYCL device selector.
217221
/// \param AsyncHandler is a SYCL asynchronous exception handler.
218222
/// \param PropList is a list of properties for queue construction.
219-
__SYCL2020_DEPRECATED("Use Callable device selectors instead of deprecated "
220-
"device_selector subclasses.")
223+
__SYCL2020_DEPRECATED("SYCL 1.2.1 device selectors are deprecated. Please "
224+
"use SYCL 2020 device selectors instead.")
221225
queue(const context &SyclContext, const device_selector &DeviceSelector,
222226
const async_handler &AsyncHandler, const property_list &PropList = {});
223227

sycl/test/warnings/sycl_2020_deprecations.cpp

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %clangxx %fsycl-host-only -fsyntax-only -ferror-limit=100 -sycl-std=2020 -Xclang -verify -Xclang -verify-ignore-unexpected=note %s -o %t.out
1+
// RUN: %clangxx %fsycl-host-only -fsyntax-only -ferror-limit=0 -sycl-std=2020 -Xclang -verify -Xclang -verify-ignore-unexpected=note %s -o %t.out
22

33
#include <CL/sycl.hpp>
44
#include <sycl/ext/intel/experimental/online_compiler.hpp>
@@ -205,6 +205,94 @@ int main() {
205205
// expected-warning@+1{{'host_selector' is deprecated: Host device is no longer supported.}}
206206
sycl::host_selector hs;
207207

208+
// expected-warning@+1{{Use SYCL 2020 callable device selectors instead.}}
209+
class user_defined_device_selector : public sycl::device_selector {
210+
public:
211+
int operator()(const sycl::device &) const override { return 100; }
212+
} uds;
213+
214+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
215+
sycl::device dd{ds};
216+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
217+
sycl::device cd{cs};
218+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
219+
sycl::device gd{gs};
220+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
221+
sycl::device ad{as};
222+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
223+
sycl::device hd{hs};
224+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
225+
sycl::device udd{uds};
226+
227+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
228+
sycl::platform dp{ds};
229+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
230+
sycl::platform cp{cs};
231+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
232+
sycl::platform gp{gs};
233+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
234+
sycl::platform ap{as};
235+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
236+
sycl::platform hp{hs};
237+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
238+
sycl::platform udp{uds};
239+
240+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
241+
sycl::queue dq1{ds};
242+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
243+
sycl::queue cq1{cs};
244+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
245+
sycl::queue gq1{gs};
246+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
247+
sycl::queue aq1{as};
248+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
249+
sycl::queue hq1{hs};
250+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
251+
sycl::queue udq1{uds};
252+
253+
sycl::context ctx;
254+
255+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
256+
sycl::queue dq2{ctx, ds};
257+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
258+
sycl::queue cq2{ctx, cs};
259+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
260+
sycl::queue gq2{ctx, gs};
261+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
262+
sycl::queue aq2{ctx, as};
263+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
264+
sycl::queue hq2{ctx, hs};
265+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
266+
sycl::queue udq2{ctx, uds};
267+
268+
auto ah = [](sycl::exception_list) {};
269+
270+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
271+
sycl::queue dq3{ds, ah};
272+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
273+
sycl::queue cq3{cs, ah};
274+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
275+
sycl::queue gq3{gs, ah};
276+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
277+
sycl::queue aq3{as, ah};
278+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
279+
sycl::queue hq3{hs, ah};
280+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
281+
sycl::queue udq3{uds, ah};
282+
283+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
284+
sycl::queue dq4{ctx, ds, ah};
285+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
286+
sycl::queue cq4{ctx, cs, ah};
287+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
288+
sycl::queue gq4{ctx, gs, ah};
289+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
290+
sycl::queue aq4{ctx, as, ah};
291+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
292+
sycl::queue hq4{ctx, hs, ah};
293+
// expected-warning@+1{{SYCL 1.2.1 device selectors are deprecated. Please use SYCL 2020 device selectors instead.}}
294+
sycl::queue udq4{ctx, uds, ah};
295+
208296
// expected-warning@+2{{'local' is deprecated: use `local_accessor` instead}}
209297
Queue.submit([&](sycl::handler &CGH) {
210298
sycl::accessor<int, 1, sycl::access::mode::read_write, sycl::target::local>

0 commit comments

Comments
 (0)