| #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 |