如何在 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。
我有一个内核,它可能会在内核中调用 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。