我有一个内核,它可以在内核内称为 asm("trap;")
。但是当发生这种情况时,CUDA错误代码设置为启动失败,我无法将其重置。
在CUDA运行时API中,我们可以使用cudaGetLastError
获取最后一个错误,并且在此期间,将其重置为cudaSuccess
。
有没有办法使用驱动程序API?
无法使用CUDA运行时API cudaGetLastError()
函数重置此类错误。
有两种类型的CUDA运行时错误:"粘性"one_answers"非粘性"。"非粘性"错误是不会破坏上下文的错误。例如,要求超过可用内存的cudaMalloc
请求将失败,但不会损坏上下文。这样的错误是"不粘的"。
涉及涉及CUDA内核意外终止的错误(包括您的trap
示例,也包括内核assert()
故障,也检测到的执行错误,例如诸如Out-Out-Out-Out-Out-Out-Out-Off-BONDS访问(。您无法使用cudaGetLastError()
清除"粘性"错误。在运行时API中清除这些错误的唯一方法是cudaDeviceReset()
(它消除了所有设备分配并擦除上下文(。
相应的驱动程序API功能是cuDevicePrimaryCtxReset()
请注意,cudaDeviceReset()
本身不足以将GPU恢复到适当的功能行为。为了实现这一目标,"拥有"过程也必须终止。看这里。