1

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

不幸的是,这失败了,错误:CUDA_ERROR_INVALID_HANDLE. 为什么?我检查了驱动程序 API 文档以查看函数在什么情况下可能会失败,并编辑它讨论了失败CUDA_ERROR_INVALID_VALUE(不是同一件事)。它没有讨论我得到的错误。

由于有多个参数cuLaunchKernel()是某种句柄 - 这种失败意味着什么?(如果有多种选择——它们是什么?)

4

2 回答 2

2

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

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

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

或者像这样:

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

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

于 2020-07-07T13:10:44.153 回答
-1

好吧,就我而言,这是一个 OOM 错误(内存不足)错误,由于某种原因没有这样报告。当我减少模型的批量大小时,它起作用了。也许你应该检查是否也是这种情况。

于 2021-12-20T08:59:50.623 回答