futhark-0.18.1: rts/c/timing.h
// Start of timing.h.
// The function get_wall_time() returns the wall time in microseconds
// (with an unspecified offset).
#ifdef _WIN32
#include <windows.h>
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 <time.h>
#include <sys/time.h>
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.