// Start of timing.h. // The function get_wall_time() returns the wall time in microseconds // (with an unspecified offset). #ifdef _WIN32 #include static int64_t get_wall_time(void) { LARGE_INTEGER time,freq; assert(QueryPerformanceFrequency(&freq)); assert(QueryPerformanceCounter(&time)); return ((double)time.QuadPart / freq.QuadPart) * 1000000; } #else // Assuming POSIX #include #include static int64_t get_wall_time(void) { struct timeval time; assert(gettimeofday(&time,NULL) == 0); return time.tv_sec * 1000000 + time.tv_usec; } static int64_t get_wall_time_ns(void) { struct timespec time; assert(clock_gettime(CLOCK_REALTIME, &time) == 0); return time.tv_sec * 1000000000 + time.tv_nsec; } static inline uint64_t rdtsc() { unsigned int hi, lo; __asm__ __volatile__("rdtsc" : "=a"(lo), "=d"(hi)); return ((uint64_t) lo) | (((uint64_t) hi) << 32); } static inline void rdtsc_wait(uint64_t n) { const uint64_t start = rdtsc(); while (rdtsc() < (start + n)) { __asm__("PAUSE"); } } static inline void spin_for(uint64_t nb_cycles) { rdtsc_wait(nb_cycles); } #endif // End of timing.h.