@@ -106,6 +106,25 @@ device select_device(DSelectorInvocableType DeviceSelectorInvocable,
106
106
return *res;
107
107
}
108
108
109
+ auto Selector = DeviceSelectorInvocable.target <int (*)(const sycl::device &)>();
110
+ if ((Selector && *Selector == gpu_selector_v)
111
+ || DeviceSelectorInvocable.target <sycl::gpu_selector>()) {
112
+ throw sycl::runtime_error (
113
+ " No device of requested type 'info::device_type::gpu' available." ,
114
+ PI_ERROR_DEVICE_NOT_FOUND);
115
+ }
116
+ if ((Selector && *Selector == cpu_selector_v)
117
+ || DeviceSelectorInvocable.target <sycl::cpu_selector>()) {
118
+ throw sycl::runtime_error (
119
+ " No device of requested type 'info::device_type::cpu' available." ,
120
+ PI_ERROR_DEVICE_NOT_FOUND);
121
+ }
122
+ if ((Selector && *Selector == accelerator_selector_v)
123
+ || DeviceSelectorInvocable.target <sycl::accelerator_selector>()) {
124
+ throw sycl::runtime_error (" No device of requested type "
125
+ " 'info::device_type::accelerator' available." ,
126
+ PI_ERROR_DEVICE_NOT_FOUND);
127
+ }
109
128
throw sycl::runtime_error (" No device of requested type available." ,
110
129
PI_ERROR_DEVICE_NOT_FOUND);
111
130
}
@@ -137,10 +156,20 @@ select_device(const DSelectorInvocableType &DeviceSelectorInvocable,
137
156
// / 2. CPU
138
157
// / 3. Host
139
158
// / 4. Accelerator
159
+
160
+ static void traceDeviceSelector (const std::string &DeviceType) {
161
+ bool ShouldTrace = false ;
162
+ ShouldTrace = detail::pi::trace (detail::pi::TraceLevel::PI_TRACE_BASIC);
163
+ if (ShouldTrace) {
164
+ std::cout << " SYCL_PI_TRACE[all]: Requested device_type: " << DeviceType << std::endl;
165
+ }
166
+ }
167
+
140
168
__SYCL_EXPORT int default_selector_v (const device &dev) {
141
169
// The default selector doesn't reject any devices.
142
170
int Score = 0 ;
143
171
172
+ traceDeviceSelector (" info::device_type::automatic" );
144
173
if (dev.get_info <info::device::device_type>() == detail::get_forced_type ())
145
174
Score += 2000 ;
146
175
@@ -165,6 +194,7 @@ __SYCL_EXPORT int default_selector_v(const device &dev) {
165
194
__SYCL_EXPORT int gpu_selector_v (const device &dev) {
166
195
int Score = detail::REJECT_DEVICE_SCORE;
167
196
197
+ traceDeviceSelector (" info::device_type::gpu" );
168
198
if (dev.is_gpu ()) {
169
199
Score = 1000 ;
170
200
Score += detail::getDevicePreference (dev);
@@ -175,6 +205,7 @@ __SYCL_EXPORT int gpu_selector_v(const device &dev) {
175
205
__SYCL_EXPORT int cpu_selector_v (const device &dev) {
176
206
int Score = detail::REJECT_DEVICE_SCORE;
177
207
208
+ traceDeviceSelector (" info::device_type::cpu" );
178
209
if (dev.is_cpu ()) {
179
210
Score = 1000 ;
180
211
Score += detail::getDevicePreference (dev);
@@ -185,6 +216,7 @@ __SYCL_EXPORT int cpu_selector_v(const device &dev) {
185
216
__SYCL_EXPORT int accelerator_selector_v (const device &dev) {
186
217
int Score = detail::REJECT_DEVICE_SCORE;
187
218
219
+ traceDeviceSelector (" info::device_type::accelerator" );
188
220
if (dev.is_accelerator ()) {
189
221
Score = 1000 ;
190
222
Score += detail::getDevicePreference (dev);
@@ -196,6 +228,7 @@ int host_selector::operator()(const device &dev) const {
196
228
// Host device has been removed and host_selector has been deprecated, so this
197
229
// should never be able to select a device.
198
230
std::ignore = dev;
231
+ traceDeviceSelector (" info::device_type::host" );
199
232
return detail::REJECT_DEVICE_SCORE;
200
233
}
201
234
0 commit comments