#include #include #include #include #include #include unsigned long long old; unsigned long min_diff = LONG_MAX, max_diff = 0; unsigned long long sum_diff = 0; unsigned int count = 0; unsigned int start = 0; unsigned int distr[100]; void *thread(void *data) { long long prev, diff; unsigned int k = (unsigned int) data; volatile int *s = &start; while (!*s); while (count < 1000000) { prev = old; rdtscll(old); diff = old - prev; if (diff < min_diff) { min_diff = diff; } if (diff > max_diff) { max_diff = diff; } sum_diff += diff; count++; distr[k]++; sched_yield(); } return 0; } int main(int argc, char **argv) { int num_threads = atoi(argv[1]); pthread_t threads[num_threads]; int k; for (k = 0; k < num_threads; ++k) pthread_create(&threads[k], NULL, thread, (void*) k); rdtscll(old); start = 1; for (k = 0; k < num_threads; ++k) { pthread_join(threads[k], 0); printf("%d: %d iterations\n", k, distr[k]); } printf("min=%ld max=%ld avg=%lld\n", min_diff, max_diff, sum_diff / count); return 0; }