Added profiling functions
This commit is contained in:
		
							
								
								
									
										46
									
								
								haversine_02/src/profiler/timer.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								haversine_02/src/profiler/timer.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
#include "profiler/timer.h"
 | 
			
		||||
#include "aliases.h"
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
#include <x86intrin.h>
 | 
			
		||||
 | 
			
		||||
typedef struct timespec timespec_t;
 | 
			
		||||
 | 
			
		||||
u64 get_os_frequency() { return 1000000000; }
 | 
			
		||||
 | 
			
		||||
u64 get_os_time(void) {
 | 
			
		||||
  timespec_t ts = {0};
 | 
			
		||||
 | 
			
		||||
  if (clock_gettime(CLOCK_MONOTONIC_RAW, &ts) != 0) {
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return ts.tv_sec * get_os_frequency() + ts.tv_nsec;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
u64 read_cpu_timer(void) { return __rdtsc(); }
 | 
			
		||||
 | 
			
		||||
u64 get_cpu_freq(u64 milliseconds) {
 | 
			
		||||
  u64 os_freq = get_os_frequency();
 | 
			
		||||
  u64 os_start = get_os_time();
 | 
			
		||||
  u64 cpu_start = read_cpu_timer();
 | 
			
		||||
  u64 os_end = 0;
 | 
			
		||||
  u64 os_elapsed = 0;
 | 
			
		||||
  u64 os_wait_time = os_freq * milliseconds / 1000;
 | 
			
		||||
 | 
			
		||||
  while (os_elapsed < os_wait_time) {
 | 
			
		||||
    os_end = get_os_time();
 | 
			
		||||
    os_elapsed = os_end - os_start;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  u64 cpu_end = read_cpu_timer();
 | 
			
		||||
  u64 cpu_elapsed = cpu_end - cpu_start;
 | 
			
		||||
 | 
			
		||||
  u64 cpu_freq = 0;
 | 
			
		||||
 | 
			
		||||
  if (os_elapsed) {
 | 
			
		||||
    cpu_freq = cpu_elapsed * os_freq / os_elapsed;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return cpu_freq;
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user