我有一个内核,它可能会asm("trap;")
在内核内部调用。但是当这种情况发生时,CUDA 错误代码设置为启动失败,我无法重置它。
在 CUDA Runtime API 中,我们可以cudaGetLastError
用来获取最后一个错误,同时将其重置为cudaSuccess
.
有没有办法用 Driver API 做到这一点?
我有一个内核,它可能会asm("trap;")
在内核内部调用。但是当这种情况发生时,CUDA 错误代码设置为启动失败,我无法重置它。
在 CUDA Runtime API 中,我们可以cudaGetLastError
用来获取最后一个错误,同时将其重置为cudaSuccess
.
有没有办法用 Driver API 做到这一点?
这种类型的错误不能用 CUDA Runtime APIcudaGetLastError()
函数重置。
有两种类型的 CUDA 运行时错误:“粘性”和“非粘性”。“非粘性”错误是那些不会破坏上下文的错误。例如,cudaMalloc
请求超过可用内存的请求将失败,但不会破坏上下文。这样的错误是“非粘性”。
涉及意外终止 CUDA 内核的错误(包括您的trap
示例、内核内assert()
故障、运行时检测到的执行错误,例如越界访问)是“粘性的”。您无法使用 清除“粘性”错误cudaGetLastError()
。在运行时 API 中清除这些错误的唯一方法是cudaDeviceReset()
(消除所有设备分配,并清除上下文)。
对应的驱动API函数是cuDevicePrimaryCtxReset()
请注意,cudaDeviceReset()
仅靠其本身不足以将 GPU 恢复到正确的功能行为。为了实现这一点,“拥有”过程也必须终止。见这里。