CUDA GPU编程指南:运行时的错误处理

2023年8月8日 1011点热度 1人点赞 0条评论

前言

核函数不能像普通函数一样可以在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;
}

运行输出:

image-20230808103159028

因为线程数量最大只能是1024(至少我目前用的CUDA版本是这样),这里输入了一个非常大的数,所以报参数错误了。

当然这里给出的错误信息也不是很详细,更详细的错误信息可以到CUDA的官方文档中查阅,比如这个错误,官方文档中是这样描述的:

“这表示内核启动正在请求当前设备永远无法满足的资源。请求的每个块的共享内存多于设备支持的内存将触发此错误,请求的线程或块过多也会触发此错误。请参阅 cudaDeviceProp 了解更多设备限制。”

这样比从代码中获取到的信息详细许多。

官方文档链接:https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__TYPES.html#group__CUDART__TYPES_1g3f51e3575c2178246db0a94a430e0038

大脸猫

这个人虽然很勤快,但什么也没有留下!

文章评论