files used for all paper numbers
[IRC.git] / Robust / src / Benchmarks / SingleTM / MicroBenchmarks / cpuPinningforPthreads2.c
1 /*******************************************************************
2  * Example that uses sched_affinity for cpu pinning 
3  *
4  * adash@uci.edu
5  ********************************************************************/
6
7 #define _GNU_SOURCE
8
9 #include <errno.h>
10 #include <pthread.h>
11 #include <sched.h>
12 #include <stdarg.h>
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <sys/syscall.h>
16 #include <unistd.h>
17
18 #define ITERATIONS 100000
19 pthread_barrier_t barr;
20
21 static __inline__ unsigned long long rdtsc(void)
22 {
23   unsigned hi, lo;
24   __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
25   return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
26 }
27
28 static void set_affinity(unsigned long cpu)
29 {
30   int err;
31   cpu_set_t cpumask;
32
33   CPU_ZERO(&cpumask);
34   CPU_SET(cpu, &cpumask);
35   err = sched_setaffinity(syscall(SYS_gettid),
36       sizeof(cpu_set_t), &cpumask);
37
38   if (err == -1)
39     printf("set_affinity: %s\n", strerror(errno));
40 }
41
42 static void *_thread(void *data)
43 {
44   /* thread_id, cpu id */
45   unsigned long cpu = (unsigned long) data;
46   long retval;
47
48   set_affinity(cpu);
49
50   int count = 0;
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)
57     {
58       printf("Could not wait on barrier\n");
59       exit(-1);
60     }
61     time = rdtsc();
62     tottime += time;
63     count++;
64   }
65   printf("time= %lld clock ticks, cpu id= %ld\n", tottime/ITERATIONS, cpu);
66   pthread_exit(NULL);
67 }
68
69 int main(int argc, char *argv[])
70 {
71   unsigned long nr_cpus;
72   pthread_t *readers;
73   unsigned long i;
74   int signal;
75
76   nr_cpus = sysconf(_SC_NPROCESSORS_ONLN);
77
78   // Barrier initialization
79   if(pthread_barrier_init(&barr, NULL, nr_cpus))
80   {
81     printf("Could not create a barrier\n");
82     return -1;
83   }
84
85   readers = calloc(nr_cpus, sizeof(pthread_t));
86   if (!readers)
87     printf("Out of memory!\n");
88
89   for (i = 0; i < nr_cpus; i++) {
90     int err;
91
92     err = pthread_create(&readers[i], NULL, _thread,
93         (void *) i);
94     if (err)
95       printf("Could not pthread_create(): %s!\n",
96           strerror(errno));
97   }
98
99   for (i = 0; i < nr_cpus; i++)
100     pthread_join(readers[i], NULL);
101
102   return 0;
103 }