xref: /aosp_15_r20/external/pytorch/c10/cuda/CUDAException.cpp (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker #include <c10/cuda/CUDAException.h>
2*da0073e9SAndroid Build Coastguard Worker 
3*da0073e9SAndroid Build Coastguard Worker #include <c10/cuda/CUDADeviceAssertionHost.h>
4*da0073e9SAndroid Build Coastguard Worker #include <c10/util/Exception.h>
5*da0073e9SAndroid Build Coastguard Worker #include <cuda_runtime.h>
6*da0073e9SAndroid Build Coastguard Worker 
7*da0073e9SAndroid Build Coastguard Worker #include <string>
8*da0073e9SAndroid Build Coastguard Worker 
9*da0073e9SAndroid Build Coastguard Worker namespace c10::cuda {
10*da0073e9SAndroid Build Coastguard Worker 
c10_cuda_check_implementation(const int32_t err,const char * filename,const char * function_name,const int line_number,const bool include_device_assertions)11*da0073e9SAndroid Build Coastguard Worker void c10_cuda_check_implementation(
12*da0073e9SAndroid Build Coastguard Worker     const int32_t err,
13*da0073e9SAndroid Build Coastguard Worker     const char* filename,
14*da0073e9SAndroid Build Coastguard Worker     const char* function_name,
15*da0073e9SAndroid Build Coastguard Worker     const int line_number,
16*da0073e9SAndroid Build Coastguard Worker     const bool include_device_assertions) {
17*da0073e9SAndroid Build Coastguard Worker   const auto cuda_error = static_cast<cudaError_t>(err);
18*da0073e9SAndroid Build Coastguard Worker   const auto cuda_kernel_failure = include_device_assertions
19*da0073e9SAndroid Build Coastguard Worker       ? c10::cuda::CUDAKernelLaunchRegistry::get_singleton_ref().has_failed()
20*da0073e9SAndroid Build Coastguard Worker       : false;
21*da0073e9SAndroid Build Coastguard Worker 
22*da0073e9SAndroid Build Coastguard Worker   if (C10_LIKELY(cuda_error == cudaSuccess && !cuda_kernel_failure)) {
23*da0073e9SAndroid Build Coastguard Worker     return;
24*da0073e9SAndroid Build Coastguard Worker   }
25*da0073e9SAndroid Build Coastguard Worker 
26*da0073e9SAndroid Build Coastguard Worker   auto error_unused C10_UNUSED = cudaGetLastError();
27*da0073e9SAndroid Build Coastguard Worker   (void)error_unused;
28*da0073e9SAndroid Build Coastguard Worker 
29*da0073e9SAndroid Build Coastguard Worker   std::string check_message;
30*da0073e9SAndroid Build Coastguard Worker #ifndef STRIP_ERROR_MESSAGES
31*da0073e9SAndroid Build Coastguard Worker   check_message.append("CUDA error: ");
32*da0073e9SAndroid Build Coastguard Worker   check_message.append(cudaGetErrorString(cuda_error));
33*da0073e9SAndroid Build Coastguard Worker   check_message.append(c10::cuda::get_cuda_check_suffix());
34*da0073e9SAndroid Build Coastguard Worker   check_message.append("\n");
35*da0073e9SAndroid Build Coastguard Worker   if (include_device_assertions) {
36*da0073e9SAndroid Build Coastguard Worker     check_message.append(c10_retrieve_device_side_assertion_info());
37*da0073e9SAndroid Build Coastguard Worker   } else {
38*da0073e9SAndroid Build Coastguard Worker     check_message.append(
39*da0073e9SAndroid Build Coastguard Worker         "Device-side assertions were explicitly omitted for this error check; the error probably arose while initializing the DSA handlers.");
40*da0073e9SAndroid Build Coastguard Worker   }
41*da0073e9SAndroid Build Coastguard Worker #endif
42*da0073e9SAndroid Build Coastguard Worker 
43*da0073e9SAndroid Build Coastguard Worker   TORCH_CHECK(false, check_message);
44*da0073e9SAndroid Build Coastguard Worker }
45*da0073e9SAndroid Build Coastguard Worker 
46*da0073e9SAndroid Build Coastguard Worker } // namespace c10::cuda
47