是啥让 cuLaunchKernel 因 CUDA_ERROR_INVALID_HANDLE 而失败?

Posted

技术标签:

【中文标题】是啥让 cuLaunchKernel 因 CUDA_ERROR_INVALID_HANDLE 而失败?【英文标题】:What makes cuLaunchKernel fail with CUDA_ERROR_INVALID_HANDLE?是什么让 cuLaunchKernel 因 CUDA_ERROR_INVALID_HANDLE 而失败? 【发布时间】:2020-10-27 18:12:14 【问题描述】:

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

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

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

【问题讨论】:

CUDA_ERROR_INVALID_VALUE 和 CUDA_ERROR_INVALID_HANDLE 不是同一个错误。您收到错误是因为句柄,即函数无效 @talonmies:对。编辑了问题。 【参考方案1】:

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

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

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

或者像这样:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

您有多确定这是 OOM,而不是您的更改的另一个潜在影响?你能发布一个MWE吗? 我这边没有任何其他变化(除了批量大小)。因此,出现 OOM 错误似乎是相当合理的。

以上是关于是啥让 cuLaunchKernel 因 CUDA_ERROR_INVALID_HANDLE 而失败?的主要内容,如果未能解决你的问题,请参考以下文章

是啥让某些 android 类“必须保留”?

是啥让 API 变得“丰富”? [关闭]

是啥让 nativescript 比 ionic 更好

是啥让“FBAudienceNetwork”链接花了 20 秒?

是啥让移动对象比复制更快?

是啥让 nimble 比 shiro 更好?