cuda_helper.hpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #ifndef REMOTEAR2_CUDA_HELPER_HPP
  2. #define REMOTEAR2_CUDA_HELPER_HPP
  3. #include "config.h"
  4. #include <cuda.h>
  5. #include <cuda_runtime.h>
  6. inline bool check_cuda_api_call(CUresult api_ret, unsigned int line_number,
  7. const char *file_name, const char *api_call_str) {
  8. if (api_ret == CUDA_SUCCESS) [[likely]] return true;
  9. const char *error_name, *error_str;
  10. auto ret = cuGetErrorName(api_ret, &error_name);
  11. if (ret != CUDA_SUCCESS) [[unlikely]] error_name = "Unknown";
  12. ret = cuGetErrorString(api_ret, &error_str);
  13. if (ret != CUDA_SUCCESS) [[unlikely]] error_str = "Unknown";
  14. SPDLOG_ERROR("CUDA api call {} failed at {}:{} with error 0x{:x}:{}, {}.",
  15. api_call_str, file_name, line_number,
  16. api_ret, error_name, error_str);
  17. RET_ERROR;
  18. }
  19. inline bool check_cuda_api_call(cudaError api_ret, unsigned int line_number,
  20. const char *file_name, const char *api_call_str) {
  21. if (api_ret == cudaSuccess) [[likely]] return true;
  22. SPDLOG_ERROR("CUDA api call {} failed at {}:{} with error 0x{:x}.",
  23. api_call_str, file_name, line_number, api_ret);
  24. RET_ERROR;
  25. }
  26. #define CUDA_API_CHECK(api_call) \
  27. if (!check_cuda_api_call( \
  28. api_call, __LINE__, __FILE__, #api_call)) [[unlikely]] \
  29. return false
  30. inline bool create_cuda_context(CUcontext *ctx) {
  31. int cuda_device_count;
  32. CUDA_API_CHECK(cuDeviceGetCount(&cuda_device_count));
  33. CALL_CHECK(cuda_device_count > default_cuda_device_id);
  34. CUdevice cuda_device;
  35. CUDA_API_CHECK(cuDeviceGet(&cuda_device, default_cuda_device_id));
  36. CUDA_API_CHECK(cuCtxCreate(ctx, CU_CTX_SCHED_AUTO, cuda_device));
  37. return true;
  38. }
  39. #endif //REMOTEAR2_CUDA_HELPER_HPP