前言
核函数不能像普通函数一样可以在IDE中调试,在运行时发生错误时也不会中断,或者抛出错误信息。
但是CUDA提供了一些函数用于捕获这些错误信息。
错误捕捉函数
//返回运行时的最后一个错误代码,并清除掉这个错误 __host____device__cudaError_t cudaGetLastError ( void ) //返回运行时的最后一个错误代码,但不清除掉这个错误 __host____device__cudaError_t cudaPeekAtLastError ( void ) //通过错误代码获取这个错误的名称,返回一个字符串 __host____device__const char* cudaGetErrorName ( cudaError_t error ) //通过错误代码获取这个错误的详细信息,返回一个字符串 __host____device__const char* cudaGetErrorString ( cudaError_t error )
这个四个函数声明时使用了host和device两个关键字,这意味着这些函数既可以在普通函数中被调用,也可以在核函数中被调用。
示例
#include "cuda_runtime.h" #include "device_launch_parameters.h" #include <stdio.h> void disposError() { cudaError error = cudaGetLastError(); if (error == cudaError::cudaSuccess) return; printf(cudaGetErrorName(error)); printf(" : "); printf(cudaGetErrorString(error)); printf("\n"); } __global__ void kernel() { printf("hello world"); } int main() { kernel << <1,9999 >> >() ; disposError(); return 0; }
运行输出:
因为线程数量最大只能是1024(至少我目前用的CUDA版本是这样),这里输入了一个非常大的数,所以报参数错误了。
当然这里给出的错误信息也不是很详细,更详细的错误信息可以到CUDA的官方文档中查阅,比如这个错误,官方文档中是这样描述的:
“这表示内核启动正在请求当前设备永远无法满足的资源。请求的每个块的共享内存多于设备支持的内存将触发此错误,请求的线程或块过多也会触发此错误。请参阅 cudaDeviceProp 了解更多设备限制。”
这样比从代码中获取到的信息详细许多。
文章评论