我有一个内核,它可能会在内核内部调用
asm("trap;")
。但当发生这种情况时,CUDA 错误代码将设置为启动失败,并且我无法重置它。
在 CUDA Runtime API 中,我们可以使用
cudaGetLastError
来获取最后一个错误,同时将其重置为 cudaSuccess
。
有没有办法使用驱动程序 API 来做到这一点?
此类错误无法使用 CUDA Runtime API
cudaGetLastError()
函数重置。
CUDA 运行时错误有两种类型:“粘性”和“非粘性”。 “非粘性”错误是那些不会破坏上下文的错误。 例如,请求超过可用内存的
cudaMalloc
请求将会失败,但不会破坏上下文。 这样的错误就是“不粘”的。
涉及 CUDA 内核意外终止的错误(包括您的
trap
示例,还有内核中 assert()
故障,以及运行时检测到的执行错误,例如越界访问)是“粘性”的。 您无法使用 cudaGetLastError()
清除“粘性”错误。 在运行时 API 中清除这些错误的唯一方法是 cudaDeviceReset()
(它消除了所有设备分配,并清除了上下文)。
cuDevicePrimaryCtxReset()
请注意,
cudaDeviceReset()
本身不足以将 GPU 恢复到正确的功能行为。 为了实现这一点,“拥有”过程也必须终止。 请参阅此处。
请注意,在最新版本的 CUDA 中,即使存在粘性错误,多次调用
cudaGetLastError()
也可能会导致错误报告更改回 cudaSuccess
。 然而,在存在粘性错误的情况下,此时任何进一步尝试有意义地使用运行时 API 都将再次导致粘性错误的报告,直到上下文被破坏为止,例如。使用 cudaDeviceReset()
或拥有进程终止。