#pragma once
#if defined(__ANDROID__) || defined(__linux__)
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/syscall.h>
#include <linux/perf_event.h>
#endif /* __ANDROID__ || __linux__ */
#include <torch/csrc/profiler/perf.h>
namespace torch {
namespace profiler {
namespace impl {
namespace linux_perf {
/*
* PerfEvent
* ---------
*/
inline void PerfEvent::Disable() const {
#if defined(__ANDROID__) || defined(__linux__)
ioctl(fd_, PERF_EVENT_IOC_DISABLE, 0);
#endif /* __ANDROID__ || __linux__ */
}
inline void PerfEvent::Enable() const {
#if defined(__ANDROID__) || defined(__linux__)
ioctl(fd_, PERF_EVENT_IOC_ENABLE, 0);
#endif /* __ANDROID__ || __linux__ */
}
inline void PerfEvent::Reset() const {
#if defined(__ANDROID__) || defined(__linux__)
ioctl(fd_, PERF_EVENT_IOC_RESET, 0);
#endif /* __ANDROID__ || __linux__ */
}
/*
* PerfProfiler
* ------------
*/
inline uint64_t PerfProfiler::CalcDelta(uint64_t start, uint64_t end) const {
if (end < start) { // overflow
return end + (std::numeric_limits<uint64_t>::max() - start);
}
// not possible to wrap around start for a 64b cycle counter
return end - start;
}
inline void PerfProfiler::StartCounting() const {
for (auto& e : events_) {
e.Enable();
}
}
inline void PerfProfiler::StopCounting() const {
for (auto& e : events_) {
e.Disable();
}
}
} // namespace linux_perf
} // namespace impl
} // namespace profiler
} // namespace torch