从网上抄来的几个处理错误的宏
// 应该是因为定义在了头文件里,所以用了static static void HandleError( cudaError_t err, const char *file, int line ) { if (err != cudaSuccess) { printf( "%s in %s at line %d\n", cudaGetErrorString( err ), file, line ); exit( EXIT_FAILURE ); } } #define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ )) #define HANDLE_NULL( a ) {if (a == NULL) { \ printf( "Host memory failed in %s at line %d\n", \ __FILE__, __LINE__ ); \ exit( EXIT_FAILURE );}}
// check cuda error inline void check(cudaError_t call, const char* file, const int line) { if (call != cudaSuccess) { std::cout << "cuda error: " << cudaGetErrorName(call) << std::endl; std::cout << "at file: " << file << ", line: " << line << std::endl; std::cout << cudaGetErrorString(call) << std::endl; } } #define CHECK(call) (check(call, __FILE__, __LINE__))
// Generated by AI // 最简单的情况:可以接受Device和Host一直同步,也就是不需要多个kernel并行 // 每个kernel的launch error和runtime error都可以很方便地捕获 cudaStream_t stream1, stream2; cudaStreamCreate(&stream1); cudaStreamCreate(&stream2); // Kernel A on stream1 kernelA<<<grid, block, 0, stream1>>>(...); cudaError_t err = cudaGetLastError(); if (err != cudaSuccess) { fprintf(stderr, "[Kernel A] Launch Error: %s\n", cudaGetErrorString(err)); exit(EXIT_FAILURE); } err = cudaStreamSynchronize(stream1); // 同步 if (err != cudaSuccess) { fprintf(stderr, "[Kernel A] Execution Error: %s\n", cudaGetErrorString(err)); exit(EXIT_FAILURE); } // Kernel B on stream2 kernelB<<<grid, block, 0, stream2>>>(...); err = cudaGetLastError(); if (err != cudaSuccess) { fprintf(stderr, "[Kernel B] Launch Error: %s\n", cudaGetErrorString(err)); exit(EXIT_FAILURE); } err = cudaStreamSynchronize(stream2); if (err != cudaSuccess) { fprintf(stderr, "[Kernel B] Execution Error: %s\n", cudaGetErrorString(err)); exit(EXIT_FAILURE); }