4

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

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

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

4

1 回答 1

7

这种类型的错误不能用 CUDA Runtime APIcudaGetLastError()函数重置。

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

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

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

请注意,cudaDeviceReset()仅靠其本身不足以将 GPU 恢复到正确的功能行为。为了实现这一点,“拥有”过程也必须终止。见这里

于 2017-04-27T13:37:38.093 回答