blob: 8695c7bb5ad3f49a3736f7764e1ee7dc646273cb [file] [log] [blame]
#include <torch/csrc/profiler/stubs/base.h>
#include <c10/util/Exception.h>
namespace torch {
namespace profiler {
namespace impl {
ProfilerStubs::~ProfilerStubs() = default;
namespace {
struct DefaultStubs : public ProfilerStubs {
DefaultStubs(const char* name) : name_{name} {}
void record(int*, ProfilerEventStub*, int64_t*) const override {
fail();
}
float elapsed(const ProfilerEventStub*, const ProfilerEventStub*)
const override {
fail();
return 0.f;
}
void mark(const char*) const override {
fail();
}
void rangePush(const char*) const override {
fail();
}
void rangePop() const override {
fail();
}
bool enabled() const override {
return false;
}
void onEachDevice(std::function<void(int)>) const override {
fail();
}
void synchronize() const override {
fail();
}
~DefaultStubs() override = default;
private:
void fail() const {
AT_ERROR(name_, " used in profiler but not enabled.");
}
const char* const name_;
};
} // namespace
#define REGISTER_DEFAULT(name, upper_name) \
namespace { \
const DefaultStubs default_##name##_stubs{#upper_name}; \
constexpr const DefaultStubs* default_##name##_stubs_addr = \
&default_##name##_stubs; \
\
/* Constant initialization, so it is guaranteed to be initialized before*/ \
/* static initialization calls which may invoke register<name>Methods*/ \
inline const ProfilerStubs*& name##_stubs() { \
static const ProfilerStubs* stubs_ = \
static_cast<const ProfilerStubs*>(default_##name##_stubs_addr); \
return stubs_; \
} \
} /*namespace*/ \
\
const ProfilerStubs* name##Stubs() { \
return name##_stubs(); \
} \
\
void register##upper_name##Methods(ProfilerStubs* stubs) { \
name##_stubs() = stubs; \
}
REGISTER_DEFAULT(cuda, CUDA)
REGISTER_DEFAULT(itt, ITT)
#undef REGISTER_DEFAULT
} // namespace impl
} // namespace profiler
} // namespace torch