【问题标题】: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:对。编辑了问题。

标签: cuda cuda-driver


【解决方案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 错误似乎是相当合理的。
    猜你喜欢
    • 2012-04-06
    • 2012-09-08
    • 2013-09-24
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    相关资源
    最近更新 更多