util.h - libzahl - big integer library
HTML git clone git://git.suckless.org/libzahl
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
util.h (2543B)
---
1 #if defined(__linux__)
2 # define _GNU_SOURCE
3 # include <sched.h>
4 #endif
5
6 #include <limits.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <time.h>
11 #include <unistd.h>
12
13
14
15 #ifdef BENCHMARK_LIB
16 # include BENCHMARK_LIB
17 #else
18 # include "../zahl.h"
19 # define BIGINT_LIBRARY "libzahl"
20 #endif
21
22 #ifndef LIBRARY_SUFFIX
23 # define LIBRARY_SUFFIX ""
24 #endif
25
26 #ifndef USE_CPU
27 # define USE_CPU 0
28 #endif
29
30
31 #ifndef CLOCK_MONOTONIC_RAW
32 # define CLOCK_MONOTONIC_RAW CLOCK_MONOTONIC
33 #endif
34
35 #ifdef __x86_64__
36 # define RDTSC_MAYBE_SUPPORTED
37 #endif
38
39 #if !defined(USE_RDTSC) && !defined(USE_CLOCK) && !defined(USE_GETTIME)
40 # if 1 && defined(RDTSC_MAYBE_SUPPORTED) && defined(__linux__)
41 # define USE_RDTSC
42 # elif 1
43 # define USE_CLOCK
44 # else
45 # define USE_GETTIME
46 # endif
47 #endif
48
49
50
51 extern char timebuf[512];
52 extern unsigned long long int freq;
53
54 #ifndef COMPILING_UTIL_C
55
56 static struct timespec dur;
57
58 # if defined(USE_RDTSC) && defined(__x86_64__)
59 typedef unsigned long long int rdtsc_t;
60 static unsigned int start_high, start_low, end_high, end_low;
61 # define rdtsc_join(low, high) ((rdtsc_t)(low) | (((rdtsc_t)(high)) << 32))
62 # define TIC (rdtsc(&start_low, &start_high))
63 # define TOC\
64 do {\
65 rdtsc_t dur_cycles;\
66 double dur_seconds;\
67 rdtsc(&end_low, &end_high);\
68 dur_cycles = rdtsc_join(end_low, end_high);\
69 dur_cycles -= rdtsc_join(start_low, start_high);\
70 dur_seconds = (double)dur_cycles;\
71 dur_seconds /= 1000 * (double)freq;\
72 dur_seconds -= (double)(dur.tv_sec = (int)dur_seconds);\
73 dur.tv_nsec = (long int)(dur_seconds * 1000000000L);\
74 } while (0)
75 static inline void
76 rdtsc(unsigned int *low, unsigned int *high)
77 {
78 __asm__ __volatile__ ("rdtsc" : "=a"(*low), "=d"(*high));
79 }
80
81 # elif defined(USE_CLOCK)
82 static clock_t start, end;
83 # define TIC (start = clock())
84 # define TOC\
85 do {\
86 end = clock();\
87 dur.tv_sec = (end - start) / 1000000ULL;\
88 dur.tv_nsec = ((end - start) % 1000000ULL) * 1000;\
89 } while (0)
90
91 # elif defined(USE_GETTIME)
92 static struct timespec start;
93 # define TIC clock_gettime(CLOCK_MONOTONIC_RAW, &start)
94 # define TOC\
95 do {\
96 clock_gettime(CLOCK_MONOTONIC_RAW, &dur);\
97 dur.tv_sec -= start.tv_sec;\
98 dur.tv_nsec -= start.tv_nsec;\
99 if (dur.tv_nsec < 0) {\
100 dur.tv_nsec += 1000000000L;\
101 dur.tv_sec -= 1;\
102 }\
103 } while (0)
104
105 # endif
106
107
108 # define TICKS ((unsigned long long int)(dur.tv_sec) * 1000000000ULL + (unsigned long long int)(dur.tv_nsec))
109 # define STIME (sprintf(timebuf, "%lli.%09li", (long long)(dur.tv_sec), dur.tv_nsec), timebuf)
110
111 #endif
112
113
114 void benchmark_init(void);