#include #include #include #include #include #include static char *argv0; static char *get_this_name(void) { static char *this_name; char *arg; char *p; if (this_name) return this_name; arg = argv0; p = arg+strlen(arg); while (p >= arg && *p != '/') p--; p++; this_name = p; return p; } static void usage(void) { char *p = get_this_name(); printf("usage: %s [alignement]\n" " alignment is a number offset\n" "\n",p); exit(-1); } static void __vdie(const char *fmt, va_list ap, int err) { int ret = errno; char *p = get_this_name(); if (err && errno) perror(p); else ret = -1; fprintf(stderr, " "); vfprintf(stderr, fmt, ap); fprintf(stderr, "\n"); exit(ret); } void die(const char *fmt, ...) { va_list ap; va_start(ap, fmt); __vdie(fmt, ap, 0); va_end(ap); } void pdie(const char *fmt, ...) { va_list ap; va_start(ap, fmt); __vdie(fmt, ap, 1); va_end(ap); } static unsigned long long get_time(void) { unsigned long long time; struct timespec ts; clock_gettime(CLOCK_MONOTONIC_RAW, &ts); time = ts.tv_sec * 1000000; time += ts.tv_nsec / 1000; return time; } #define ARRAY_SIZE 1000000 static void fill_array(void *array) { for (int i = 0; i < ARRAY_SIZE; i++) { *(long *)(array + sizeof(long) * i) = i; } } int main (int argc, char **argv) { unsigned long long start, end; unsigned long long val = 0; unsigned long long idx, i; void *array; int offset; argv0 = argv[0]; if (argc < 2) usage(); array = malloc((ARRAY_SIZE + 1) * sizeof(long)); if (!array) pdie("Allocating array"); fill_array(array); offset = atoi(argv[1]); start = get_time(); for (i = 0; i < ARRAY_SIZE; i++) { idx = (i * 5618) + offset; idx %= 1000000; val += *(unsigned long *)(array + idx); } end = get_time(); printf("val = %lld\n", val); printf("time = %lld us\n", end - start); return 0; }