1 /*******************************************************************
2 * Example that uses sched_affinity for cpu pinning
5 ********************************************************************/
15 #include <sys/syscall.h>
18 #define ITERATIONS 100000
19 pthread_barrier_t barr;
21 static __inline__ unsigned long long rdtsc(void)
24 __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
25 return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
28 static void set_affinity(unsigned long cpu)
34 CPU_SET(cpu, &cpumask);
35 err = sched_setaffinity(syscall(SYS_gettid),
36 sizeof(cpu_set_t), &cpumask);
39 printf("set_affinity: %s\n", strerror(errno));
42 static void *_thread(void *data)
44 /* thread_id, cpu id */
45 unsigned long cpu = (unsigned long) data;
51 unsigned long long tottime, time;
52 /* calculate the clock skew for each core */
53 while(count<ITERATIONS) {
54 // Wait till we may fire away
55 int rc=pthread_barrier_wait(&barr);
56 if(rc != 0 && rc != PTHREAD_BARRIER_SERIAL_THREAD)
58 printf("Could not wait on barrier\n");
65 printf("time= %lld clock ticks, cpu id= %ld\n", tottime/ITERATIONS, cpu);
69 int main(int argc, char *argv[])
71 unsigned long nr_cpus;
76 nr_cpus = sysconf(_SC_NPROCESSORS_ONLN);
78 // Barrier initialization
79 if(pthread_barrier_init(&barr, NULL, nr_cpus))
81 printf("Could not create a barrier\n");
85 readers = calloc(nr_cpus, sizeof(pthread_t));
87 printf("Out of memory!\n");
89 for (i = 0; i < nr_cpus; i++) {
92 err = pthread_create(&readers[i], NULL, _thread,
95 printf("Could not pthread_create(): %s!\n",
99 for (i = 0; i < nr_cpus; i++)
100 pthread_join(readers[i], NULL);