You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

timer.h 1.2 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #pragma once
  2. #include <cuda_profiler_api.h>
  3. #include <cuda_runtime_api.h>
  4. #include "test/common/utils.h"
  5. namespace megdnn {
  6. namespace test {
  7. class CUTimer {
  8. public:
  9. CUTimer(cudaStream_t& stream, cudaEvent_t& evt0, cudaEvent_t& evt1)
  10. : m_stream{stream}, m_evt0{evt0}, m_evt1{evt1} {
  11. reset();
  12. }
  13. void reset() {
  14. m_started = false;
  15. m_stopped = false;
  16. }
  17. void start() {
  18. megdnn_assert(!m_started);
  19. megdnn_assert(!m_stopped);
  20. m_started = true;
  21. cudaProfilerStart();
  22. cudaEventRecord(m_evt0, m_stream);
  23. }
  24. void stop() {
  25. megdnn_assert(m_started);
  26. megdnn_assert(!m_stopped);
  27. m_stopped = true;
  28. cudaEventRecord(m_evt1, m_stream);
  29. cudaProfilerStop();
  30. }
  31. size_t get_time_in_us() const {
  32. cudaStreamSynchronize(m_stream);
  33. float t = -1;
  34. cudaEventElapsedTime(&t, m_evt0, m_evt1);
  35. return static_cast<size_t>(t * 1e3);
  36. }
  37. private:
  38. bool m_started, m_stopped;
  39. size_t m_start_point, m_stop_point;
  40. cudaStream_t& m_stream;
  41. cudaEvent_t &m_evt0, &m_evt1;
  42. };
  43. } // namespace test
  44. } // namespace megdnn
  45. // vim: syntax=cpp.doxygen