|
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
-
- #ifndef MEASURE_H
- #define MEASURE_H
-
- #ifndef REPEAT
- #define REPEAT 100
- #endif
-
- #ifndef OUTER_REPEAT
- #define OUTER_REPEAT 10
- #endif
-
- #ifndef WARMUP
- #define WARMUP REPEAT / 4
- #endif
-
- unsigned long long RDTSC_start_clk, RDTSC_end_clk;
- double RDTSC_total_clk;
- double RDTSC_TEMP_CLK;
- int RDTSC_MEASURE_ITERATOR;
- int RDTSC_OUTER_ITERATOR;
-
- inline static unsigned long get_Clks(void)
- {
- unsigned hi, lo;
- __asm__ __volatile__("rdtscp\n\t"
- : "=a"(lo), "=d"(hi)::"rcx");
- return ((unsigned long)lo) ^ (((unsigned long)hi) << 32);
- }
-
- #define RDTSC_MEASURE(x) \
- for (RDTSC_MEASURE_ITERATOR = 0; RDTSC_MEASURE_ITERATOR < WARMUP; RDTSC_MEASURE_ITERATOR++) \
- { \
- {x}; \
- } \
- RDTSC_total_clk = 1.7976931348623157e+308; \
- for (RDTSC_OUTER_ITERATOR = 0; RDTSC_OUTER_ITERATOR < OUTER_REPEAT; RDTSC_OUTER_ITERATOR++) \
- { \
- RDTSC_start_clk = get_Clks(); \
- for (RDTSC_MEASURE_ITERATOR = 0; RDTSC_MEASURE_ITERATOR < REPEAT; RDTSC_MEASURE_ITERATOR++) \
- { \
- {x}; \
- } \
- RDTSC_end_clk = get_Clks(); \
- RDTSC_TEMP_CLK = (double)(RDTSC_end_clk - RDTSC_start_clk) / REPEAT; \
- if (RDTSC_total_clk > RDTSC_TEMP_CLK) \
- RDTSC_total_clk = RDTSC_TEMP_CLK; \
- }
-
- #define MEASURE(x) RDTSC_MEASURE(x)
-
- #endif
|