9#include <cuda_runtime.h>
15template<
typename Derived>
20 Derived& operator<<(T&& v) {
21 os_ << std::forward<T>(v);
22 return static_cast<Derived&
>(*this);
25 std::ostringstream os_;
31 CheckStream(
const char* file,
int line,
const char* func,
const char* expr) {
32 os_ <<
"Lamppp: Runtime error thrown at " << file <<
':' << line
33 <<
" in " << func <<
". CHECK(" << expr <<
") failed: ";
36 [[noreturn]]
void trigger()
const {
37 std::cerr << os_.str() << std::endl;
38 throw std::runtime_error(os_.str());
44class AssertStream :
public BaseStream<AssertStream> {
46 AssertStream(
const char* file,
int line,
const char* func,
const char* expr) {
47 os_ <<
"Lamppp: Internal assertion failure at " << file <<
':' << line
48 <<
" in " << func <<
". ASSERT(" << expr <<
") failed: ";
51 [[noreturn]]
void trigger()
const {
52 std::cerr << os_.str() << std::endl;
58class CudaAssertStream :
public BaseStream<CudaAssertStream> {
60 CudaAssertStream(
const char* file,
int line,
const char* func, cudaError_t err) {
61 os_ <<
"Lamppp: CUDA error at " << file <<
':' << line
62 <<
" in " << func <<
". Error: " << cudaGetErrorString(err) <<
". ";
65 [[noreturn]]
void trigger()
const {
66 std::cerr << os_.str() << std::endl;
76 void operator&(T&& stream)
const {
84#define LMP_CHECK(cond) \
85 (cond) ? (void)0 : ::lmp::detail::Voidify() & ::lmp::detail::CheckStream(__FILE__, __LINE__, __func__, #cond)
89#define LMP_INTERNAL_ASSERT(cond) \
90 (cond) ? (void)0 : ::lmp::detail::Voidify() & ::lmp::detail::AssertStream(__FILE__, __LINE__, __func__, #cond)
95namespace lmp::detail {
97inline cudaError_t& cuda_assert_last_error() {
98 static thread_local cudaError_t last{};
103inline bool cuda_assert_once(F&& f) {
104 cuda_assert_last_error() = f();
105 return cuda_assert_last_error() != cudaSuccess;
110#define LMP_CUDA_INTERNAL_ASSERT(call) \
111 if (const cudaError_t LMP_CUDA_ERROR = (call); LMP_CUDA_ERROR == cudaSuccess) \
114 ::lmp::detail::Voidify() & \
115 ::lmp::detail::CudaAssertStream(__FILE__, __LINE__, __func__, \
118#define LMP_CUDA_CHECK(call) \
119 if (const cudaError_t LMP_CUDA_ERROR = (call); LMP_CUDA_ERROR == cudaSuccess) \
122 ::lmp::detail::Voidify() & \
123 ::lmp::detail::CudaAssertStream(__FILE__, __LINE__, __func__, \
128#define LMP_PRINT(fmt, ...) \
129 fprintf(stderr, "[%s:%d] %s: " fmt "\n", __FILE__, __LINE__, __func__, \
134namespace lmp::detail {
136 template<
typename T>
NullStream& operator<<(T&&) {
return *
this; }
137 void trigger()
const {}
141#define LMP_INTERNAL_ASSERT(cond) \
142 true ? (void)0 : ::lmp::detail::Voidify() & ::lmp::detail::NullStream()
143#define LMP_CUDA_INTERNAL_ASSERT(call) \
144 true ? (void)0 : ::lmp::detail::Voidify() & ::lmp::detail::NullStream()
145#define LMP_CUDA_CHECK(call) \
146 (call) ? (void)0 : ::lmp::detail::Voidify() & ::lmp::detail::NullStream()
Definition assert.hpp:135