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