@@ -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
166166QMgrHelper::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
245245QMgrHelper::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
304312QMgrHelper::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}
0 commit comments