前言
核函数不能像普通函数一样可以在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 了解更多设备限制。”
这样比从代码中获取到的信息详细许多。
文章评论