4 #if defined(__x86_64__)
5 #include <sys/sysctl.h>
8 #include <mach/mach_time.h>
9 #endif // __x86_64__ or not
21 # include <sys/time.h>
36 namespace CycleTimer {
42 #if defined(__APPLE__) && !defined(__x86_64__)
43 return mach_absolute_time();
46 QueryPerformanceCounter(&qwTime);
47 return qwTime.QuadPart;
48 #elif defined(__x86_64__)
50 asm volatile(
"rdtsc" :
"=a" (a),
"=d" (d));
51 return static_cast<unsigned long long>(a) |
52 (static_cast<unsigned long long>(d) << 32);
53 #elif defined(__ARM_NEON__) && 0 // mrc requires superuser.
55 asm volatile(
"mrc p15, 0, %0, c9, c13, 0" :
"=r"(val));
59 clock_gettime(CLOCK_THREAD_CPUTIME_ID, &spec);
60 return CycleTimer::SysClock(static_cast<float>(spec.tv_sec) * 1e9 + static_cast<float>(spec.tv_nsec));
65 #if defined(__APPLE__) && !defined(__x86_64__)
67 #elif defined(__WIN32__) || defined(__x86_64__)
76 static bool initialized =
false;
77 static double secondsPerTick_val;
78 if (initialized)
return secondsPerTick_val;
79 #if defined(__APPLE__)
81 int args[] = {CTL_HW, HW_CPU_FREQ};
83 size_t len =
sizeof(Hz);
84 if (sysctl(args, 2, &Hz, &len, NULL, 0) != 0) {
85 fprintf(stderr,
"Failed to initialize secondsPerTick_val!\n");
88 secondsPerTick_val = 1.0 / (double) Hz;
90 mach_timebase_info_data_t time_info;
91 mach_timebase_info(&time_info);
94 secondsPerTick_val = (1e-9*
static_cast<double>(time_info.numer))/
95 static_cast<double>(time_info.denom);
96 #endif // x86_64 or not
98 LARGE_INTEGER qwTicksPerSec;
99 QueryPerformanceFrequency(&qwTicksPerSec);
100 secondsPerTick_val = 1.0/
static_cast<double>(qwTicksPerSec.QuadPart);
102 FILE *fp = fopen(
"/proc/cpuinfo",
"r");
105 fprintf(stderr,
"CycleTimer::resetScale failed: couldn't find /proc/cpuinfo.");
109 secondsPerTick_val = 1e-9;
110 while (!feof(fp) && fgets(input, 1024, fp)) {
114 if (strstr(input,
"model name")) {
115 char* at_sign = strstr(input,
"@");
117 char* after_at = at_sign + 1;
118 char* GHz_str = strstr(after_at,
"GHz");
119 char* MHz_str = strstr(after_at,
"MHz");
122 if (1 == sscanf(after_at,
"%f", &GHz)) {
124 secondsPerTick_val = 1e-9f / GHz;
127 }
else if (MHz_str) {
129 if (1 == sscanf(after_at,
"%f", &MHz)) {
131 secondsPerTick_val = 1e-6f / GHz;
136 }
else if (1 == sscanf(input,
"cpu MHz : %f", &MHz)) {
138 secondsPerTick_val = 1e-6f / MHz;
146 return secondsPerTick_val;