File indexing completed on 2024-04-06 12:15:44
0001 #ifndef HeterogeneousCore_CUDAUtilities_cudaCheck_h
0002 #define HeterogeneousCore_CUDAUtilities_cudaCheck_h
0003
0004
0005 #include <iostream>
0006 #include <sstream>
0007 #include <stdexcept>
0008 #include <string>
0009 #include <string_view>
0010
0011
0012 #include <cuda.h>
0013 #include <cuda_runtime.h>
0014
0015
0016 #include "FWCore/Utilities/interface/Likely.h"
0017
0018 namespace cms {
0019 namespace cuda {
0020
0021 [[noreturn]] inline void abortOnCudaError(const char* file,
0022 int line,
0023 const char* cmd,
0024 const char* error,
0025 const char* message,
0026 std::string_view description = std::string_view()) {
0027 std::ostringstream out;
0028 out << "\n";
0029 out << file << ", line " << line << ":\n";
0030 out << "cudaCheck(" << cmd << ");\n";
0031 out << error << ": " << message << "\n";
0032 if (!description.empty())
0033 out << description << "\n";
0034 throw std::runtime_error(out.str());
0035 }
0036
0037 inline bool cudaCheck_(const char* file,
0038 int line,
0039 const char* cmd,
0040 CUresult result,
0041 std::string_view description = std::string_view()) {
0042 if (LIKELY(result == CUDA_SUCCESS))
0043 return true;
0044
0045 const char* error = nullptr;
0046 const char* message = nullptr;
0047 cuGetErrorName(result, &error);
0048 cuGetErrorString(result, &message);
0049 abortOnCudaError(file, line, cmd, error, message, description);
0050 return false;
0051 }
0052
0053 inline bool cudaCheck_(const char* file,
0054 int line,
0055 const char* cmd,
0056 cudaError_t result,
0057 std::string_view description = std::string_view()) {
0058 if (LIKELY(result == cudaSuccess))
0059 return true;
0060
0061 const char* error = cudaGetErrorName(result);
0062 const char* message = cudaGetErrorString(result);
0063 abortOnCudaError(file, line, cmd, error, message, description);
0064 return false;
0065 }
0066 }
0067 }
0068
0069 #define cudaCheck(ARG, ...) (cms::cuda::cudaCheck_(__FILE__, __LINE__, #ARG, (ARG), ##__VA_ARGS__))
0070
0071 #endif