10#include <cuda_runtime.h>
16template<
typename Derived>
21 Derived& operator<<(T&& v) {
22 os_ << std::forward<T>(v);
23 return static_cast<Derived&
>(*this);
26 std::ostringstream os_;
32 CheckStream(
const char* file,
int line,
const char* func,
const char* expr) {
33 os_ <<
"Lamppp: Runtime error thrown at " << file <<
':' << line
34 <<
" in " << func <<
". CHECK(" << expr <<
") failed: ";
37 [[noreturn]]
void trigger()
const {
38 std::cerr << os_.str() << std::endl;
39 throw std::runtime_error(os_.str());
45class AssertStream :
public BaseStream<AssertStream> {
47 AssertStream(
const char* file,
int line,
const char* func,
const char* expr) {
48 os_ <<
"Lamppp: Internal assertion failure at " << file <<
':' << line
49 <<
" in " << func <<
". ASSERT(" << expr <<
") failed: ";
52 [[noreturn]]
void trigger()
const {
53 std::cerr << os_.str() << std::endl;
59class CudaAssertStream :
public BaseStream<CudaAssertStream> {
61 CudaAssertStream(
const char* file,
int line,
const char* func, cudaError_t err) {
62 os_ <<
"Lamppp: CUDA error at " << file <<
':' << line
63 <<
" in " << func <<
". Error: " << cudaGetErrorString(err) <<
". ";
66 [[noreturn]]
void trigger()
const {
67 std::cerr << os_.str() << std::endl;
77 void operator&(T&& stream)
const {
85#define LMP_CHECK(cond) \
86 (cond) ? (void)0 : ::lmp::detail::Voidify() & ::lmp::detail::CheckStream(__FILE__, __LINE__, __func__, #cond)
90#define LMP_INTERNAL_ASSERT(cond) \
91 (cond) ? (void)0 : ::lmp::detail::Voidify() & ::lmp::detail::AssertStream(__FILE__, __LINE__, __func__, #cond)
96namespace lmp::detail {
98inline cudaError_t& cuda_assert_last_error() {
99 static thread_local cudaError_t last{};
104inline bool cuda_assert_once(F&& f) {
105 cuda_assert_last_error() = f();
106 return cuda_assert_last_error() != cudaSuccess;
111#define LMP_CUDA_INTERNAL_ASSERT(call) \
112 if (const cudaError_t LMP_CUDA_ERROR = (call); LMP_CUDA_ERROR == cudaSuccess) \
115 ::lmp::detail::Voidify() & \
116 ::lmp::detail::CudaAssertStream(__FILE__, __LINE__, __func__, \
119#define LMP_CUDA_CHECK(call) \
120 if (const cudaError_t LMP_CUDA_ERROR = (call); LMP_CUDA_ERROR == cudaSuccess) \
123 ::lmp::detail::Voidify() & \
124 ::lmp::detail::CudaAssertStream(__FILE__, __LINE__, __func__, \
129#define LMP_PRINT(fmt, ...) \
130 fprintf(stderr, "[%s:%d] %s: " fmt "\n", __FILE__, __LINE__, __func__, \
135namespace lmp::detail {
137 template<
typename T>
NullStream& operator<<(T&&) {
return *
this; }
138 void trigger()
const {}
142#define LMP_INTERNAL_ASSERT(cond) \
143 true ? (void)0 : ::lmp::detail::Voidify() & ::lmp::detail::NullStream()
144#define LMP_CUDA_INTERNAL_ASSERT(call) \
145 true ? (void)0 : ::lmp::detail::Voidify() & ::lmp::detail::NullStream()
146#define LMP_CUDA_CHECK(call) \
147 (call) ? (void)0 : ::lmp::detail::Voidify() & ::lmp::detail::NullStream()
Definition assert.hpp:136