是啥让 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 而失败?的主要内容,如果未能解决你的问题,请参考以下文章