@@ -51,6 +51,17 @@ typedef struct complex
5151 uint64_t imag;
5252} complexNumber;
5353
54+ void set_dependent_events (handler &cgh,
55+ __dpctl_keep const DPCTLSyclEventRef *DepEvents,
56+ size_t NDepEvents)
57+ {
58+ for (auto i = 0ul ; i < NDepEvents; ++i) {
59+ auto ei = unwrap<event>(DepEvents[i]);
60+ if (ei)
61+ cgh.depends_on (*ei);
62+ }
63+ }
64+
5465/* !
5566 * @brief Set the kernel arg object
5667 *
@@ -107,6 +118,21 @@ bool set_kernel_arg(handler &cgh,
107118 return arg_set;
108119}
109120
121+ void set_kernel_args (handler &cgh,
122+ __dpctl_keep void **Args,
123+ __dpctl_keep const DPCTLKernelArgType *ArgTypes,
124+ size_t NArgs)
125+ {
126+ for (auto i = 0ul ; i < NArgs; ++i) {
127+ if (!set_kernel_arg (cgh, i, Args[i], ArgTypes[i])) {
128+ error_handler (" Kernel argument could not be created." , __FILE__,
129+ __func__, __LINE__);
130+ throw std::invalid_argument (
131+ " Kernel argument could not be created." );
132+ }
133+ }
134+ }
135+
110136std::unique_ptr<property_list> create_property_list (int properties)
111137{
112138 std::unique_ptr<property_list> propList;
@@ -341,39 +367,52 @@ DPCTLQueue_SubmitRange(__dpctl_keep const DPCTLSyclKernelRef KRef,
341367 event e;
342368
343369 try {
344- e = Queue->submit ([&](handler &cgh) {
345- // Depend on any event that was specified by the caller.
346- if (NDepEvents)
347- for (auto i = 0ul ; i < NDepEvents; ++i)
348- cgh.depends_on (*unwrap<event>(DepEvents[i]));
349-
350- for (auto i = 0ul ; i < NArgs; ++i) {
351- // \todo add support for Sycl buffers
352- if (!set_kernel_arg (cgh, i, Args[i], ArgTypes[i]))
353- exit (1 );
354- }
355- switch (NDims) {
356- case 1 :
370+ switch (NDims) {
371+ case 1 :
372+ {
373+ e = Queue->submit ([&](handler &cgh) {
374+ // Depend on any event that was specified by the caller.
375+ set_dependent_events (cgh, DepEvents, NDepEvents);
376+ set_kernel_args (cgh, Args, ArgTypes, NArgs);
357377 cgh.parallel_for (range<1 >{Range[0 ]}, *Kernel);
358- break ;
359- case 2 :
378+ });
379+ return wrap<event>(new event (std::move (e)));
380+ }
381+ case 2 :
382+ {
383+ e = Queue->submit ([&](handler &cgh) {
384+ // Depend on any event that was specified by the caller.
385+ set_dependent_events (cgh, DepEvents, NDepEvents);
386+ set_kernel_args (cgh, Args, ArgTypes, NArgs);
360387 cgh.parallel_for (range<2 >{Range[0 ], Range[1 ]}, *Kernel);
361- break ;
362- case 3 :
388+ });
389+ return wrap<event>(new event (std::move (e)));
390+ }
391+ case 3 :
392+ {
393+ e = Queue->submit ([&](handler &cgh) {
394+ // Depend on any event that was specified by the caller.
395+ set_dependent_events (cgh, DepEvents, NDepEvents);
396+ set_kernel_args (cgh, Args, ArgTypes, NArgs);
363397 cgh.parallel_for (range<3 >{Range[0 ], Range[1 ], Range[2 ]},
364398 *Kernel);
365- break ;
366- default :
367- throw std::runtime_error (" Range cannot be greater than three "
368- " dimensions." );
369- }
370- });
399+ });
400+ return wrap<event>(new event (std::move (e)));
401+ }
402+ default :
403+ error_handler (" Range cannot be greater than three "
404+ " dimensions." ,
405+ __FILE__, __func__, __LINE__, error_level::error);
406+ return nullptr ;
407+ }
371408 } catch (std::exception const &e) {
372- error_handler (e, __FILE__, __func__, __LINE__);
409+ error_handler (e, __FILE__, __func__, __LINE__, error_level::error);
410+ return nullptr ;
411+ } catch (...) {
412+ error_handler (" Unknown exception encountered" , __FILE__, __func__,
413+ __LINE__, error_level::error);
373414 return nullptr ;
374415 }
375-
376- return wrap<event>(new event (std::move (e)));
377416}
378417
379418__dpctl_give DPCTLSyclEventRef
@@ -393,46 +432,56 @@ DPCTLQueue_SubmitNDRange(__dpctl_keep const DPCTLSyclKernelRef KRef,
393432 event e;
394433
395434 try {
396- e = Queue->submit ([&](handler &cgh) {
397- // Depend on any event that was specified by the caller.
398- if (DepEvents)
399- for (auto i = 0ul ; i < NDepEvents; ++i) {
400- auto ei = unwrap<event>(DepEvents[i]);
401- if (ei)
402- cgh.depends_on (*ei);
403- }
404-
405- for (auto i = 0ul ; i < NArgs; ++i) {
406- // \todo add support for Sycl buffers
407- if (!set_kernel_arg (cgh, i, Args[i], ArgTypes[i]))
408- exit (1 );
409- }
410- switch (NDims) {
411- case 1 :
435+ switch (NDims) {
436+ case 1 :
437+ {
438+ e = Queue->submit ([&](handler &cgh) {
439+ // Depend on any event that was specified by the caller.
440+ set_dependent_events (cgh, DepEvents, NDepEvents);
441+ set_kernel_args (cgh, Args, ArgTypes, NArgs);
412442 cgh.parallel_for (nd_range<1 >{{gRange [0 ]}, {lRange[0 ]}},
413443 *Kernel);
414- break ;
415- case 2 :
444+ });
445+ return wrap<event>(new event (std::move (e)));
446+ }
447+ case 2 :
448+ {
449+ e = Queue->submit ([&](handler &cgh) {
450+ // Depend on any event that was specified by the caller.
451+ set_dependent_events (cgh, DepEvents, NDepEvents);
452+ set_kernel_args (cgh, Args, ArgTypes, NArgs);
416453 cgh.parallel_for (
417454 nd_range<2 >{{gRange [0 ], gRange [1 ]}, {lRange[0 ], lRange[1 ]}},
418455 *Kernel);
419- break ;
420- case 3 :
456+ });
457+ return wrap<event>(new event (std::move (e)));
458+ }
459+ case 3 :
460+ {
461+ e = Queue->submit ([&](handler &cgh) {
462+ // Depend on any event that was specified by the caller.
463+ set_dependent_events (cgh, DepEvents, NDepEvents);
464+ set_kernel_args (cgh, Args, ArgTypes, NArgs);
421465 cgh.parallel_for (nd_range<3 >{{gRange [0 ], gRange [1 ], gRange [2 ]},
422466 {lRange[0 ], lRange[1 ], lRange[2 ]}},
423467 *Kernel);
424- break ;
425- default :
426- throw std::runtime_error (" Range cannot be greater than three "
427- " dimensions." );
428- }
429- });
468+ });
469+ return wrap<event>(new event (std::move (e)));
470+ }
471+ default :
472+ error_handler (" Range cannot be greater than three "
473+ " dimensions." ,
474+ __FILE__, __func__, __LINE__, error_level::error);
475+ return nullptr ;
476+ }
430477 } catch (std::exception const &e) {
431- error_handler (e, __FILE__, __func__, __LINE__);
478+ error_handler (e, __FILE__, __func__, __LINE__, error_level::error);
479+ return nullptr ;
480+ } catch (...) {
481+ error_handler (" Unknown exception encountered" , __FILE__, __func__,
482+ __LINE__, error_level::error);
432483 return nullptr ;
433484 }
434-
435- return wrap<event>(new event (std::move (e)));
436485}
437486
438487void DPCTLQueue_Wait (__dpctl_keep DPCTLSyclQueueRef QRef)
0 commit comments