Debugging cuda设置cudaError

Debugging cuda设置cudaError,debugging,cuda,Debugging,Cuda,如何在cuda内核中设置cudaError变量(例如,对于非致命但逻辑错误的情况) 我的cuda内核意外抛出nan值,我正在对此进行调试。运行时API错误报告机制不能用于用户设备代码报告错误 如果希望设备代码返回异常状态指示器,最简单的方法是声明一个静态全局内存标志变量,并让任何遇到错误的线程写入该标志。如果希望线程中止内核,可以执行以下操作: __device__ int errorflag; __global__ void kernel() { // Processing code

如何在cuda内核中设置cudaError变量(例如,对于非致命但逻辑错误的情况)


我的cuda内核意外抛出nan值,我正在对此进行调试。

运行时API错误报告机制不能用于用户设备代码报告错误

如果希望设备代码返回异常状态指示器,最简单的方法是声明一个静态全局内存标志变量,并让任何遇到错误的线程写入该标志。如果希望线程中止内核,可以执行以下操作:

__device__ int errorflag;

__global__ void kernel()
{
    // Processing code here

    if (errorcondition) {
        errorflag=errorcode;
        __threadfence();
        asm("trap;");
    }
}

这将导致运行时发出异常终止错误信号,错误条件保存在
errorflag
中。您可以使用主机代码中的
cudaMemcpyToSymbol
errorflag
读回以检查结果。如果您愿意,也可以使用指向零拷贝内存的指针,在这种情况下,您需要使用
\uu threadfence\u system()
调用,以确保在执行陷阱之前将写入刷新到主机。

如何捕获并清除该陷阱?触发该陷阱后,我的应用程序似乎无法恢复。cudaGetLastError()第一次返回“4”,第二次返回“0”(表示已清除状态),但在下游我仍然会收到运行时未指定的启动错误(err=4)或驱动程序启动失败错误(err=700)。如何捕获并清除该陷阱?触发该陷阱后,我的应用程序似乎无法恢复。cudaGetLastError()第一次返回“4”,第二次返回“0”(表示已清除状态),但在运行时未指定的启动错误(err=4)或驱动程序启动失败错误(err=700)。