CUDA ERROR CHECK 宏

CUDA 代码出错时往往不会第一时间报错并终止程序,程序报错的地方可能并不是真正出问题的地方

可以利用自定义宏,方便的判断 CUDA 内置函数的返回值与检查cuda 程序运行状态,及时发现程序问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<stdio.h>

#define CUDA_SAFE_CALL(err) __cudaSafeCall (err, __FILE__, __LINE__)

inline void __cudaSafeCall( cudaError err, const char *file, const int line )
{
if( cudaSuccess != err) {
fprintf(stderr, "%s(%i) : cudaSafeCall() Runtime API error %d: %s.\n",
file, line, (int)err, cudaGetErrorString( err ) );
exit(-1);
}
}

#define CUDA_CHECK_ERROR() __cudaCheckError( __FILE__, __LINE__ )

inline void __cudaCheckError( const char *file, const int line )
{

cudaError err = cudaGetLastError();
if ( cudaSuccess != err )
{
fprintf( stderr, "cudaCheckError() failed at %s:%i : %s\n",
file, line, cudaGetErrorString( err ) );
exit( -1 );
}

return;
}

#define CUDA_CHECK_ERROR_SYNC() __cudaCheckErrorSync( __FILE__, __LINE__ )

inline void __cudaCheckErrorSync( const char *file, const int line )
{

// More careful checking. However, this will affect performance.
err = cudaDeviceSynchronize();
if( cudaSuccess != err )
{
fprintf( stderr, "cudaCheckError() with sync failed at %s:%i : %s\n",
file, line, cudaGetErrorString( err ) );
exit( -1 );
}

return;
}

宏CUDA_SAFE_CALL的作用是检查 cuda 内置函数的返回值,若返回不为 success 则打印错误信息并退出程序,如

1
CUDA_SAFE_CALL(CudaMalloc(*****))

CUDA_CHECK_ERROR与CUDA_CHECK_ERROR_SYNC的作用是在程序中获取最近的一个错误的信息,常被用来检查核函数的错误。SYNC 多了一个同步操作,所以其检查更为精准,但是同步会带来较大的性能开销,最好是用 debug 等宏进行修饰,避免影响正确运行的程序的性能。