1 | #include "timing.h" |
---|---|
2 | #include <stdio.h> |
3 | |
4 | #define INPUT_TYPE int64_t |
5 | #define INPUT_SIZE 512 |
6 | #define FUNCTION_NAME __floatdidf |
7 | |
8 | #ifndef LIBNAME |
9 | #define LIBNAME UNKNOWN |
10 | #endif |
11 | |
12 | #define LIBSTRING LIBSTRINGX(LIBNAME) |
13 | #define LIBSTRINGX(a) LIBSTRINGXX(a) |
14 | #define LIBSTRINGXX(a) #a |
15 | |
16 | double FUNCTION_NAME(INPUT_TYPE x); |
17 | |
18 | int main(int argc, char *argv[]) { |
19 | INPUT_TYPE input[INPUT_SIZE]; |
20 | int i, j; |
21 | |
22 | srand(seed: 42); |
23 | |
24 | // Initialize the input array with data of various sizes. |
25 | for (i=0; i<INPUT_SIZE; ++i) |
26 | input[i] = (((uint64_t)rand() << 32) | (uint64_t)rand()) >> (rand() & 63); |
27 | |
28 | double bestTime = __builtin_inf(); |
29 | void *dummyp; |
30 | for (j=0; j<1024; ++j) { |
31 | |
32 | uint64_t startTime = mach_absolute_time(); |
33 | for (i=0; i<INPUT_SIZE; ++i) |
34 | FUNCTION_NAME(x: input[i]); |
35 | uint64_t endTime = mach_absolute_time(); |
36 | |
37 | double thisTime = intervalInCycles(startTime, endTime); |
38 | bestTime = __builtin_fmin(thisTime, bestTime); |
39 | |
40 | // Move the stack alignment between trials to eliminate (mostly) aliasing effects |
41 | dummyp = alloca(1); |
42 | } |
43 | |
44 | printf(format: "%16s: %f cycles.\n", LIBSTRING, bestTime / (double) INPUT_SIZE); |
45 | |
46 | return 0; |
47 | } |
48 |