From ae70aed4a790c6622dcfb821f545f41ca02a9ae7 Mon Sep 17 00:00:00 2001 From: Nils Kasulke Date: Mon, 20 Apr 2020 18:53:56 +0200 Subject: [PATCH] test for rdtsc --- measure/clock_measure.c | 49 ++++++++++++++++++++++++++++++ measure/measure.c | 67 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 measure/clock_measure.c create mode 100644 measure/measure.c diff --git a/measure/clock_measure.c b/measure/clock_measure.c new file mode 100644 index 0000000..4bc6583 --- /dev/null +++ b/measure/clock_measure.c @@ -0,0 +1,49 @@ +/* + * not usable clock() isn't precise enough + * + * + */ +#include +#include +#include +#include + +void usage_and_exit(); + +int main(int argc, char* argv[]) { + if(argc != 4) usage_and_exit(); + + uint64_t t0, t1; + int a, b; + sscanf(argv[2], "%d", &a); + sscanf(argv[3], "%d", &b); + if(argv[1][0] == 'd') { + double out; + t0 = (uint64_t) clock(); + out = (double) a / b; + t1 = (uint64_t) clock(); + printf("out = %lf\n", out); + } else if(argv[1][0] == 'f') { + float out; + t0 = (uint64_t) clock(); + out = (float) a / b; + t1 = (uint64_t) clock(); + printf("out = %f\n", out); + } else if(argv[1][0] == 'i') { + int out; + t0 = (uint64_t) clock(); + out = a / b; + t1 = (uint64_t) clock(); + printf("out = %d\n", out); + } else { + usage_and_exit(); + } + printf("clocks = %lu\n", t1 - t0); +} +void usage_and_exit() { + printf(" \n"); + printf("i = integer\n"); + printf("f = float\n"); + printf("d = double\n"); + exit(1); +} diff --git a/measure/measure.c b/measure/measure.c new file mode 100644 index 0000000..f612754 --- /dev/null +++ b/measure/measure.c @@ -0,0 +1,67 @@ +#include +#ifdef _WIN32 +#include +#else +#include +#endif + +#include + +// Windows +#ifdef _WIN32 + +#include +uint64_t rdtsc(){ + return __rdtsc(); +} +// Linux/GCC +#else + +uint64_t rdtsc(){ + unsigned int lo,hi; + __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); + return ((uint64_t)hi << 32) | lo; +} +#endif + +void usage_and_exit(); + +int main(int argc, char* argv[]) { + if(argc != 4) usage_and_exit(); + + uint64_t t0, t1; + int a, b; + sscanf(argv[2], "%d", &a); + sscanf(argv[3], "%d", &b); + if(argv[1][0] == 'x') { + printf("filler found\n"); + } else if(argv[1][0] == 'i') { + int out; + t0 = rdtsc(); + out = a + b; + t1 = rdtsc(); + printf("out = %d\n", out); + } else if(argv[1][0] == 'f') { + float out; + t0 = rdtsc(); + out = (float) a + b; + t1 = rdtsc(); + printf("out = %f\n", out); + } else if(argv[1][0] == 'd') { + double out; + t0 = rdtsc(); + out = (double) a + b; + t1 = rdtsc(); + printf("out = %lf\n", out); + } else { + usage_and_exit(); + } + printf("clocks = %lu\n", t1 - t0); +} +void usage_and_exit() { + printf(" \n"); + printf("i = integer\n"); + printf("f = float\n"); + printf("d = double\n"); + exit(1); +}