如何在 trap 指令后使用 Driver API 将 CUDA 错误重置为成功?

How can I reset the CUDA error to success with Driver API after a trap instruction?

我有一个内核,它可能会在内核中调用 asm("trap;")。但是当发生这种情况时,CUDA 错误代码设置为启动失败,我无法重置它。

在 CUDA Runtime API 中,我们可以使用 cudaGetLastError 获取最后一个错误,同时将其重置为 cudaSuccess

有没有办法用 Driver API 做到这一点?

无法使用 CUDA 运行时 API cudaGetLastError() 函数重置此类错误。

有两种类型的 CUDA 运行时错误:"sticky" 和 "non-sticky"。 "non-sticky" 错误是那些不破坏上下文的错误。例如,请求超过可用内存的 cudaMalloc 请求将失败,但不会破坏上下文。这样的错误是"non-sticky".

涉及 CUDA 内核意外终止的错误(包括您的 trap 示例,还有内核 assert() 故障,以及运行时检测到的执行错误,例如越界访问)是"sticky"。您无法使用 cudaGetLastError() 清除 "sticky" 错误。在运行时 API 中清除这些错误的唯一方法是 cudaDeviceReset()(它消除了所有设备分配,并清除了上下文)。

对应的驱动API函数为cuDevicePrimaryCtxReset()

请注意,cudaDeviceReset() 本身不足以将 GPU 恢复到正常的功能行为。为了实现这一点,"owning" 进程也必须终止。参见 here