19 #include <rmm/logger.hpp>
21 #include <cuda_runtime_api.h>
37 using std::logic_error::logic_error;
45 using std::runtime_error::runtime_error;
54 bad_alloc(
const char* msg) : _what{std::string{std::bad_alloc::what()} +
": " + msg} {}
57 [[nodiscard]]
const char* what()
const noexcept
override {
return _what.c_str(); }
79 using std::out_of_range::out_of_range;
84 #define STRINGIFY_DETAIL(x) #x
85 #define RMM_STRINGIFY(x) STRINGIFY_DETAIL(x)
110 #define RMM_EXPECTS(...) \
111 GET_RMM_EXPECTS_MACRO(__VA_ARGS__, RMM_EXPECTS_3, RMM_EXPECTS_2) \
113 #define GET_RMM_EXPECTS_MACRO(_1, _2, _3, NAME, ...) NAME
114 #define RMM_EXPECTS_3(_condition, _exception_type, _reason) \
115 (!!(_condition)) ? static_cast<void>(0) \
116 : throw _exception_type \
118 "RMM failure at: " __FILE__ ":" RMM_STRINGIFY(__LINE__) ": " _reason \
120 #define RMM_EXPECTS_2(_condition, _reason) RMM_EXPECTS_3(_condition, rmm::logic_error, _reason)
134 #define RMM_FAIL(...) \
135 GET_RMM_FAIL_MACRO(__VA_ARGS__, RMM_FAIL_2, RMM_FAIL_1) \
137 #define GET_RMM_FAIL_MACRO(_1, _2, NAME, ...) NAME
138 #define RMM_FAIL_2(_what, _exception_type) \
140 throw _exception_type{"RMM failure at:" __FILE__ ":" RMM_STRINGIFY(__LINE__) ": " _what};
141 #define RMM_FAIL_1(_what) RMM_FAIL_2(_what, rmm::logic_error)
164 #define RMM_CUDA_TRY(...) \
165 GET_RMM_CUDA_TRY_MACRO(__VA_ARGS__, RMM_CUDA_TRY_2, RMM_CUDA_TRY_1) \
167 #define GET_RMM_CUDA_TRY_MACRO(_1, _2, NAME, ...) NAME
168 #define RMM_CUDA_TRY_2(_call, _exception_type) \
170 cudaError_t const error = (_call); \
171 if (cudaSuccess != error) { \
172 cudaGetLastError(); \
174 throw _exception_type{std::string{"CUDA error at: "} + __FILE__ + ":" + \
175 RMM_STRINGIFY(__LINE__) + ": " + cudaGetErrorName(error) + " " + \
176 cudaGetErrorString(error)}; \
179 #define RMM_CUDA_TRY_1(_call) RMM_CUDA_TRY_2(_call, rmm::cuda_error)
191 #define RMM_CUDA_TRY_ALLOC(_call) \
193 cudaError_t const error = (_call); \
194 if (cudaSuccess != error) { \
195 cudaGetLastError(); \
196 auto const msg = std::string{"CUDA error at: "} + __FILE__ + ":" + RMM_STRINGIFY(__LINE__) + \
197 ": " + cudaGetErrorName(error) + " " + cudaGetErrorString(error); \
198 if (cudaErrorMemoryAllocation == error) { \
199 throw rmm::out_of_memory{msg}; \
201 throw rmm::bad_alloc{msg}; \
232 #define RMM_ASSERT_CUDA_SUCCESS(_call) \
237 #define RMM_ASSERT_CUDA_SUCCESS(_call) \
239 cudaError_t const status__ = (_call); \
240 if (status__ != cudaSuccess) { \
241 std::cerr << "CUDA Error detected. " << cudaGetErrorName(status__) << " " \
242 << cudaGetErrorString(status__) << std::endl; \
245 assert(status__ == cudaSuccess); \
253 #define RMM_LOGGING_ASSERT(_expr) (void)0
254 #elif SPDLOG_ACTIVE_LEVEL < SPDLOG_LEVEL_OFF
255 #define RMM_LOGGING_ASSERT(_expr) \
257 bool const success = (_expr); \
260 "[" __FILE__ ":" RMM_STRINGIFY(__LINE__) "] Assertion " RMM_STRINGIFY(_expr) " failed."); \
261 rmm::logger().flush(); \
267 #define RMM_LOGGING_ASSERT(_expr) assert((_expr));