Skip to content

Commit 4572588

Browse files
author
Diptorup Deb
committed
Return the queue that was set as default. Helps in error checking.
1 parent fb1fbb2 commit 4572588

File tree

4 files changed

+60
-40
lines changed

4 files changed

+60
-40
lines changed

backends/include/dppl_sycl_queue_manager.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -104,18 +104,20 @@ bool DPPLQueueMgr_IsCurrentQueue (__dppl_keep const DPPLSyclQueueRef QRef);
104104

105105
/*!
106106
* @brief Set the default DPPL queue to the sycl::queue for the given backend
107-
* and device type combination.
108-
*
109-
* If no such device is found the a runtime_error exception is thrown.
107+
* and device type combination and return a DPPLSyclQueueRef for that queue.
108+
* If no queue was created Null is returned to caller.
110109
*
111110
* @param BETy Type of Sycl backend.
112111
* @param DeviceTy The type of Sycl device (sycl_device_type)
113-
* @param DNum Device id for the device (defaults to 0)
112+
* @param DNum Device id for the device
113+
* @return A copy of the sycl::queue that was set as the new default queue. If no
114+
* queue could be created then returns Null.
114115
*/
115116
DPPL_API
116-
void DPPLQueueMgr_SetAsDefaultQueue (enum DPPLSyclBEType BETy,
117-
enum DPPLSyclDeviceType DeviceTy,
118-
size_t DNum);
117+
__dppl_give DPPLSyclQueueRef
118+
DPPLQueueMgr_SetAsDefaultQueue (enum DPPLSyclBEType BETy,
119+
enum DPPLSyclDeviceType DeviceTy,
120+
size_t DNum);
119121

120122
/*!
121123
* @brief Pushes a new sycl::queue object to the top of DPPL's thread-local

backends/source/dppl_sycl_queue_manager.cpp

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ class QMgrHelper
123123

124124
static bool isCurrentQueue (__dppl_keep const DPPLSyclQueueRef QRef);
125125

126-
static void
126+
static __dppl_give DPPLSyclQueueRef
127127
setAsDefaultQueue (enum DPPLSyclBEType BETy,
128128
enum DPPLSyclDeviceType DeviceTy,
129129
size_t DNum);
@@ -162,7 +162,7 @@ DPPLSyclQueueRef QMgrHelper::getCurrentQueue ()
162162
* for deallocating it. The helper function DPPLQueue_Delete should
163163
* be used for that purpose.
164164
*/
165-
DPPLSyclQueueRef
165+
__dppl_give DPPLSyclQueueRef
166166
QMgrHelper::getQueue (enum DPPLSyclBEType BETy,
167167
enum DPPLSyclDeviceType DeviceTy,
168168
size_t DNum)
@@ -241,57 +241,65 @@ bool QMgrHelper::isCurrentQueue (__dppl_keep const DPPLSyclQueueRef QRef)
241241
* Changes the first entry into the stack, i.e., the default queue to a new
242242
* sycl::queue corresponding to the device type and device number.
243243
*/
244-
void
244+
__dppl_give DPPLSyclQueueRef
245245
QMgrHelper::setAsDefaultQueue (enum DPPLSyclBEType BETy,
246246
enum DPPLSyclDeviceType DeviceTy,
247247
size_t DNum)
248248
{
249-
if(get_active_queues().empty()) {
249+
queue *QRef = nullptr;
250+
auto &activeQ = get_active_queues();
251+
if(activeQ.empty()) {
250252
std::cerr << "active queue vector is corrupted.\n";
251-
return;
253+
return nullptr;
252254
}
253255

254256
switch (BETy|DeviceTy)
255257
{
256258
case DPPLSyclBEType::DPPL_OPENCL | DPPLSyclDeviceType::DPPL_CPU:
257259
{
258-
if (DNum >= get_opencl_cpu_queues().size()) {
260+
auto oclcpu_q = get_opencl_cpu_queues();
261+
if (DNum >= oclcpu_q.size()) {
259262
// \todo handle error
260263
std::cerr << "OpenCL CPU device " << DNum
261264
<< " not found on system\n.";
262-
break;
265+
return nullptr;
263266
}
264-
get_active_queues()[0] = get_opencl_cpu_queues()[DNum];
267+
activeQ[0] = oclcpu_q[DNum];
265268
break;
266269
}
267270
case DPPLSyclBEType::DPPL_OPENCL | DPPLSyclDeviceType::DPPL_GPU:
268271
{
269-
if (DNum >= get_opencl_gpu_queues().size()) {
272+
auto oclgpu_q = get_opencl_gpu_queues();
273+
if (DNum >= oclgpu_q.size()) {
270274
// \todo handle error
271275
std::cerr << "OpenCL GPU device " << DNum
272276
<< " not found on system\n.";
273-
break;
277+
return nullptr;
274278
}
275-
get_active_queues()[0] = get_opencl_gpu_queues()[DNum];
279+
activeQ[0] = oclgpu_q[DNum];
276280
break;
277281
}
278282
case DPPLSyclBEType::DPPL_LEVEL_ZERO | DPPLSyclDeviceType::DPPL_GPU:
279283
{
280-
if (DNum >= get_level0_gpu_queues().size()) {
284+
auto l0gpu_q = get_level0_gpu_queues();
285+
if (DNum >= l0gpu_q.size()) {
281286
// \todo handle error
282287
std::cerr << "Level-0 GPU device " << DNum
283288
<< " not found on system\n.";
284-
break;
289+
return nullptr;
285290
}
286-
get_active_queues()[0] = get_level0_gpu_queues()[DNum];
291+
activeQ[0] = l0gpu_q[DNum];
287292
break;
288293
}
289294
default:
290295
{
291296
std::cerr << "Unsupported device type.\n";
292-
return;
297+
return nullptr;
293298
}
294299
}
300+
301+
QRef = new queue(activeQ[0]);
302+
return wrap(QRef);
295303
}
296304

297305
/*!
@@ -300,13 +308,14 @@ QMgrHelper::setAsDefaultQueue (enum DPPLSyclBEType BETy,
300308
* cleaned up. The helper function DPPLDeleteSyclQueue() can be used is for that
301309
* purpose.
302310
*/
303-
DPPLSyclQueueRef
311+
__dppl_give DPPLSyclQueueRef
304312
QMgrHelper::pushSyclQueue (enum DPPLSyclBEType BETy,
305313
enum DPPLSyclDeviceType DeviceTy,
306314
size_t DNum)
307315
{
308316
queue *QRef = nullptr;
309-
if(get_active_queues().empty()) {
317+
auto &activeQ = get_active_queues();
318+
if(activeQ.empty()) {
310319
std::cerr << "Why is there no previous global context?\n";
311320
return nullptr;
312321
}
@@ -321,8 +330,8 @@ QMgrHelper::pushSyclQueue (enum DPPLSyclBEType BETy,
321330
<< " not found on system\n.";
322331
return nullptr;
323332
}
324-
get_active_queues().emplace_back(get_opencl_cpu_queues()[DNum]);
325-
QRef = new queue(get_active_queues()[get_active_queues().size()-1]);
333+
activeQ.emplace_back(get_opencl_cpu_queues()[DNum]);
334+
QRef = new queue(activeQ[activeQ.size()-1]);
326335
break;
327336
}
328337
case DPPLSyclBEType::DPPL_OPENCL | DPPLSyclDeviceType::DPPL_GPU:
@@ -333,8 +342,8 @@ QMgrHelper::pushSyclQueue (enum DPPLSyclBEType BETy,
333342
<< " not found on system\n.";
334343
return nullptr;
335344
}
336-
get_active_queues().emplace_back(get_opencl_gpu_queues()[DNum]);
337-
QRef = new queue(get_active_queues()[get_active_queues().size()-1]);
345+
activeQ.emplace_back(get_opencl_gpu_queues()[DNum]);
346+
QRef = new queue(activeQ[get_active_queues().size()-1]);
338347
break;
339348
}
340349
case DPPLSyclBEType::DPPL_LEVEL_ZERO | DPPLSyclDeviceType::DPPL_GPU:
@@ -345,8 +354,8 @@ QMgrHelper::pushSyclQueue (enum DPPLSyclBEType BETy,
345354
<< " not found on system\n.";
346355
return nullptr;
347356
}
348-
get_active_queues().emplace_back(get_level0_gpu_queues()[DNum]);
349-
QRef = new queue(get_active_queues()[get_active_queues().size()-1]);
357+
activeQ.emplace_back(get_level0_gpu_queues()[DNum]);
358+
QRef = new queue(activeQ[get_active_queues().size()-1]);
350359
break;
351360
}
352361
default:
@@ -455,12 +464,13 @@ bool DPPLQueueMgr_IsCurrentQueue (__dppl_keep const DPPLSyclQueueRef QRef)
455464
/*!
456465
* The function sets the global queue, i.e., the sycl::queue object at
457466
* QMgrHelper::active_queues[0] vector to the sycl::queue corresponding to the
458-
* specified device type and id. A runtime_error gets thrown if no such device
459-
* exists.
467+
* specified device type and id. If not queue was found for the backend and
468+
* device, Null is returned.
460469
*/
461-
void DPPLQueueMgr_SetAsDefaultQueue (enum DPPLSyclBEType BETy,
462-
enum DPPLSyclDeviceType DeviceTy,
463-
size_t DNum)
470+
__dppl_give DPPLSyclQueueRef
471+
DPPLQueueMgr_SetAsDefaultQueue (enum DPPLSyclBEType BETy,
472+
enum DPPLSyclDeviceType DeviceTy,
473+
size_t DNum)
464474
{
465475
QMgrHelper::setAsDefaultQueue(BETy, DeviceTy, DNum);
466476
}

dpctl/backend.pxd

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,9 +189,11 @@ cdef extern from "dppl_sycl_queue_manager.h":
189189
cdef DPPLSyclQueueRef DPPLQueueMgr_PushQueue (DPPLSyclBEType BETy,
190190
DPPLSyclDeviceType DeviceTy,
191191
size_t DNum)
192-
cdef void DPPLQueueMgr_SetAsDefaultQueue (DPPLSyclBEType BETy,
193-
DPPLSyclDeviceType DeviceTy,
194-
size_t DNum)
192+
cdef DPPLSyclQueueRef DPPLQueueMgr_SetAsDefaultQueue (
193+
DPPLSyclBEType BETy,
194+
DPPLSyclDeviceType DeviceTy,
195+
size_t DNum
196+
)
195197

196198

197199
cdef extern from "dppl_sycl_usm_interface.h":

dpctl/sycl_core.pyx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -645,12 +645,18 @@ cdef class _SyclRTManager:
645645
return False
646646

647647
def set_default_queue (self, backend_ty, device_ty, device_id):
648-
648+
cdef DPPLSyclQueueRef ret
649649
try :
650650
beTy = self._backend_ty_dict[backend_ty]
651651
try :
652652
devTy = self._device_ty_dict[device_ty]
653-
DPPLQueueMgr_SetAsDefaultQueue(beTy, devTy, device_id)
653+
ret = DPPLQueueMgr_SetAsDefaultQueue(beTy, devTy, device_id)
654+
if ret is NULL:
655+
self._raise_queue_creation_error(
656+
backend_ty, device_ty, device_id,
657+
"DPPLQueueMgr_PushQueue"
658+
)
659+
654660
except KeyError:
655661
raise UnsupportedDeviceError("Device can only be gpu or cpu")
656662
except KeyError:

0 commit comments

Comments
 (0)