Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

4 лет назад
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #ifndef MEASURE_H
  2. #define MEASURE_H
  3. #ifndef REPEAT
  4. #define REPEAT 100
  5. #endif
  6. #ifndef OUTER_REPEAT
  7. #define OUTER_REPEAT 10
  8. #endif
  9. #ifndef WARMUP
  10. #define WARMUP REPEAT / 4
  11. #endif
  12. unsigned long long RDTSC_start_clk, RDTSC_end_clk;
  13. double RDTSC_total_clk;
  14. double RDTSC_TEMP_CLK;
  15. int RDTSC_MEASURE_ITERATOR;
  16. int RDTSC_OUTER_ITERATOR;
  17. inline static unsigned long get_Clks(void)
  18. {
  19. unsigned hi, lo;
  20. __asm__ __volatile__("rdtscp\n\t"
  21. : "=a"(lo), "=d"(hi)::"rcx");
  22. return ((unsigned long)lo) ^ (((unsigned long)hi) << 32);
  23. }
  24. #define RDTSC_MEASURE(x) \
  25. for (RDTSC_MEASURE_ITERATOR = 0; RDTSC_MEASURE_ITERATOR < WARMUP; RDTSC_MEASURE_ITERATOR++) \
  26. { \
  27. {x}; \
  28. } \
  29. RDTSC_total_clk = 1.7976931348623157e+308; \
  30. for (RDTSC_OUTER_ITERATOR = 0; RDTSC_OUTER_ITERATOR < OUTER_REPEAT; RDTSC_OUTER_ITERATOR++) \
  31. { \
  32. RDTSC_start_clk = get_Clks(); \
  33. for (RDTSC_MEASURE_ITERATOR = 0; RDTSC_MEASURE_ITERATOR < REPEAT; RDTSC_MEASURE_ITERATOR++) \
  34. { \
  35. {x}; \
  36. } \
  37. RDTSC_end_clk = get_Clks(); \
  38. RDTSC_TEMP_CLK = (double)(RDTSC_end_clk - RDTSC_start_clk) / REPEAT; \
  39. if (RDTSC_total_clk > RDTSC_TEMP_CLK) \
  40. RDTSC_total_clk = RDTSC_TEMP_CLK; \
  41. }
  42. #define MEASURE(x) RDTSC_MEASURE(x)
  43. #endif