@@ -444,20 +444,48 @@ function generate_cpp(library::String, filename::Vector{String}, output::String;
444444 variant = " column_major::"
445445 end
446446
447+ # Build catch clause: LAPACK functions also catch computation_error for info
448+ lapack_catch = " catch (const oneapi::mkl::lapack::computation_error& e) { return e.info(); } catch (const sycl::exception& e) { return -1; }"
449+ sycl_catch = " catch (const sycl::exception& e) { return -1; }"
450+
447451 write (oneapi_cpp, " extern \" C\" $header {\n " )
448452 if template
449453 type = version_types[version]
450- ! occursin (" scratchpad_size" , name) && write (oneapi_cpp, " auto status = oneapi::mkl::$library ::$variant$name <$type >($parameters , {});\n device_queue->val.wait_and_throw();\n " )
451- occursin (" scratchpad_size" , name) && write (oneapi_cpp, " int64_t scratchpad_size = oneapi::mkl::$library ::$variant$name <$type >($parameters );\n device_queue->val.wait_and_throw();\n " )
452- # !occursin("scratchpad_size", name) && write(oneapi_cpp, " auto status = oneapi::mkl::$library::$variant$name<$type>($parameters, {});\n")
453- # occursin("scratchpad_size", name) && write(oneapi_cpp, " int64_t scratchpad_size = oneapi::mkl::$library::$variant$name<$type>($parameters);\n")
454+ if ! occursin (" scratchpad_size" , name)
455+ catch_clause = library == " lapack" ? lapack_catch : sycl_catch
456+ write (oneapi_cpp, " try {\n " )
457+ write (oneapi_cpp, " auto status = oneapi::mkl::$library ::$variant$name <$type >($parameters , {});\n " )
458+ write (oneapi_cpp, " device_queue->val.wait_and_throw();\n " )
459+ write (oneapi_cpp, " } $catch_clause \n " )
460+ end
461+ if occursin (" scratchpad_size" , name)
462+ write (oneapi_cpp, " int64_t scratchpad_size = oneapi::mkl::$library ::$variant$name <$type >($parameters );\n device_queue->val.wait_and_throw();\n " )
463+ end
454464 else
455465 if ! (name ∈ void_output)
456- write (oneapi_cpp, " auto status = oneapi::mkl::$library ::$variant$name ($parameters , {});\n " )
457- occursin (" device_queue" , parameters) && write (oneapi_cpp, " device_queue->val.wait_and_throw();\n " )
466+ has_queue = occursin (" device_queue" , parameters)
467+ is_scratchpad = occursin (" scratchpad_size" , name)
468+ if has_queue && ! is_scratchpad
469+ catch_clause = library == " lapack" ? lapack_catch : sycl_catch
470+ write (oneapi_cpp, " try {\n " )
471+ write (oneapi_cpp, " auto status = oneapi::mkl::$library ::$variant$name ($parameters , {});\n " )
472+ write (oneapi_cpp, " device_queue->val.wait_and_throw();\n " )
473+ write (oneapi_cpp, " } $catch_clause \n " )
474+ else
475+ write (oneapi_cpp, " auto status = oneapi::mkl::$library ::$variant$name ($parameters , {});\n " )
476+ if has_queue
477+ write (oneapi_cpp, " device_queue->val.wait_and_throw();\n " )
478+ end
479+ end
458480 else
459- write (oneapi_cpp, " oneapi::mkl::$library ::$variant$name ($parameters );\n " )
460- occursin (" device_queue" , parameters) && write (oneapi_cpp, " device_queue->val.wait_and_throw();\n " )
481+ if occursin (" device_queue" , parameters)
482+ write (oneapi_cpp, " try {\n " )
483+ write (oneapi_cpp, " oneapi::mkl::$library ::$variant$name ($parameters );\n " )
484+ write (oneapi_cpp, " device_queue->val.wait_and_throw();\n " )
485+ write (oneapi_cpp, " } $sycl_catch \n " )
486+ else
487+ write (oneapi_cpp, " oneapi::mkl::$library ::$variant$name ($parameters );\n " )
488+ end
461489 end
462490 end
463491 if occursin (" scratchpad_size" , name)
0 commit comments