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 ) {
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 等宏进行修饰,避免影响正确运行的程序的性能。