是什么导致 cuLaunchKernel 因 CUDA_ERROR_INVALID_HANDLE 而失败?

What makes cuLaunchKernel fail with CUDA_ERROR_INVALID_HANDLE?

我正在使用 cudLaunchKernel() 驱动程序 API 函数启动我编译的 CUDA 内核。我在 kernelParams 数组中传递我的参数,并为 extra 参数传递 nullptr

不幸的是,这失败了,错误是:CUDA_ERROR_INVALID_HANDLE。为什么?我检查了 Driver API documentation 以查看函数在什么情况下可能会失败,并且 edit 它讨论了与 CUDA_ERROR_INVALID_VALUE 的失败(不是一回事)。它没有讨论我得到的错误。

因为 cuLaunchKernel() 有多个参数,这是某种句柄 - 这种失败意味着什么? (如果有多个选项 - 它们是什么?)

一种可能是由于 CUDA 驱动程序上下文切换而导致失败。您可能无意中执行了一些推送或替换 CUDA 设备当前上下文的操作;和加载的模块是上下文的一部分 - 因此您编译和加载的内核不能再在当前上下文中加载。这会触发 CUDA_ERROR_INVALID_HANDLE 失败。

假设是这种情况,请在启动前切换上下文,例如这样:

cuCtxPushCurrent(my_driver_context);
cuLaunchKernel(/*etc. etc. */);
/* possibly */ cuCtxPopCurrent(NULL);

或者像这样:

cuCtxSetCurrent(my_driver_context);
cuLaunchKernel(/*etc. etc. */);

请注意,如果您弹出并忽略对有效上下文的唯一引用,您可能会有内存泄漏的风险;并且您还可能冒着一些其他代码的风险,假设它已放置的上下文仍然是活动的。

嗯,在我的例子中,这是一个 OOM 错误(内存不足)错误,出于某种原因没有被报告为这样。当我减少模型的批量大小时,它起作用了。也许你也应该检查一下是否也是这种情况。