The essence of the Quasar C++ API is the ability to call Quasar functions. This is done via
quasar::Function::operator()(...). If an error occurs during execution of the Quasar function, a C++ exception of type exception_t will be thrown. While this class has
stack_trace fields to help figure out the origin of the error, these fields are typically rather vague.
For example, recently I ran into the problem where
quasar::Function::operator()(...) threw an
exception_t with the following information:
source: Quasar.Runtime message: CUDA_launch returned an error: CUDA Error ErrorMissingConfiguration: __global__ function call is not configured stack_trace: at Quasar.Interpreter.DirectInterpreter.OnError(Exception innerException, String msg, LineNumberRange lineNumber, Object args) at Quasar.Interpreter.DirectInterpreter.Run() at Quasar.Interpreter.DirectInterpreter.UserFunctionCall(FunctionDescriptor fd, QTypedObject closureVars, QValue vals) at Quasar.Interpreter.DirectInterpreter.EvaluateIndirectFunctionCall(QValue function, QValue args) at Quasar.NativeInterface.FunctionCallIndirect(IntPtr functionHandle, IntPtr ptrArgsIn, Int32 nArgsIn, IntPtr ptrArgsOut, Int32 nArgsOut)
It turned out that the error was really an out-of-memory condition caused by a call to
zeros(4000, 4000, 10) from within the Quasar function that was called.
I wonder if it would be possible to provide more accurate feedback in exception_t on the precise location of errors that occur while calling a Quasar function from the C++ API. Obtaining the Quasar source file name and line number would be ideal.
In this particular case, the error message itself (
__global__ function call is not configured) is not informative either, but I may need to complain to NVidia about that 🙂
OK. Thanks for the feedback! Line number information has been added now to the `exception_t::message`. Note that this is only applicable when loading source modules (.q files). For .qlib files, the line number information is lost. For the moment, I did not make any new fields in exception_t to get programmatic access to the line number/module name. In case that would be necessary let me know.