changes for modifying the microbenchmarks
[IRC.git] / Robust / src / Benchmarks / SingleTM / MicroBenchmarks / SingleObjectMod.java
1 public class SingleObjectMod extends Thread {
2   int nthreads;
3   int arrysize;
4   int loopsize;
5   int lsize1, lsize2;
6   int prob; //prob to choose if short or long transaction
7   int threadid;
8   intwrapper[] mainobj;
9   Random rand;
10
11   public SingleObjectMod() {
12
13   }
14
15   public SingleObjectMod(int nthreads, int arrysize, int loopsize, int lsize1, int lsize2, int prob, int threadid, intwrapper[] mainobj, Random rand) {
16     this.nthreads = nthreads;
17     this.arrysize = arrysize;
18     this.loopsize = loopsize;
19     this.lsize1 = lsize1;
20     this.lsize2 = lsize2;
21     this.prob = prob;
22     this.threadid = threadid;
23     this.mainobj = mainobj;
24     this.rand = rand;
25   }
26
27   public static void parseCmdLine(String args[], SingleObjectMod som) {
28     int i = 0;
29     String arg;
30     while(i < args.length && args[i].startsWith("-")) {
31       arg = args[i++];
32       //check options
33       if(arg.equals("-t")) {
34         if(i < args.length) {
35           som.nthreads = new Integer(args[i++]).intValue();
36         }
37       } else if(arg.equals("-size")) {
38         if(i <  args.length) {
39           som.arrysize = new Integer(args[i++]).intValue();
40         }
41       } else if(arg.equals("-l")) {
42         if(i < args.length) {
43           som.loopsize = new Integer(args[i++]).intValue();
44         }
45       } else if(arg.equals("-l1")) {
46         if(i < args.length) {
47           som.lsize1 = new Integer(args[i++]).intValue();
48         }
49       } else if(arg.equals("-l2")) {
50         if(i < args.length) {
51           som.lsize2 = new Integer(args[i++]).intValue();
52         }
53       } else if(arg.equals("-p")) {
54         if(i < args.length) {
55           som.prob = new Integer(args[i++]).intValue();
56         }
57       } else {
58         System.out.println("Incorrect argument");
59         System.out.println("usage: ./SingleObjectMod -t <threads> -size <array size> -l <loopsize> -l1 <inner loopsize2> -l2 <inner loopsize2> -p <prob distribution>\n");
60       }
61     }
62   }
63
64   public void run() {
65     int index, val;
66     Random rand = new Random();
67     rand.random_alloc();
68     rand.random_seed(threadid);
69     int partitionSize = (loopsize + nthreads/2) /nthreads;
70     int start = threadid * partitionSize;
71     int stop;
72     if(threadid == (nthreads - 1))
73       stop = loopsize;
74     else
75       stop = start + partitionSize;
76     LogTime[] lt = new LogTime[8*(stop-start)];
77     for(int i = 0; i<8*(stop-start); i++) {
78       lt[i] = new LogTime();
79     }
80
81     int eventcount=0;
82     //System.out.println("Start = " + start+ " stop= " + stop + " partitionSize= " + partitionSize+ " loopsize= " + loopsize + " lsize1= " + lsize1 + " lsize2= " + lsize2);
83     rand.random_seed(0);
84     int l1, l2;
85     //Time at Point1
86     lt[eventcount].event = 1;
87     lt[eventcount++].time  = System.getticks();
88
89     for(int i = start; i < stop; i++) {
90       //Time at Point2
91       lt[eventcount].event = 2;
92       lt[eventcount++].time  = System.getticks();
93
94       int distribution = (int)(rand.random_generate() % 100);
95
96       //90% long transactions
97       if(distribution < prob) {
98         l1=l2=lsize1;
99       } else {
100         //10% short transactions
101         l1=l2=lsize2;
102       }
103
104       /*
105       //50% distribution 
106       int l3= (int)(rand.random_generate() % 2); 
107       if(l3==0) {
108         l1=l2=lsize2;
109       }
110       if(l3==1) {
111         l1=l2=lsize1;
112       }
113       */
114
115       int count;
116
117       //Time at point3
118       lt[eventcount].event = 3;
119       lt[eventcount++].time  = System.getticks();
120
121       atomic {
122         //Time at Point4
123         lt[eventcount].event = 4;
124         lt[eventcount++].time  = System.getticks();
125
126         index = (int)(rand.random_generate() % arrysize);
127         // Do computation 1
128         for(int j = 0; j<l1; j++) {
129           count+=j*j*j;
130         }
131
132         //Time at Point5
133         lt[eventcount].event = 5;
134         lt[eventcount++].time  = System.getticks();
135
136         // Only read values from an object
137         val = mainobj[index];
138
139         //Time at Point6
140         lt[eventcount].event = 6;
141         lt[eventcount++].time  = System.getticks();
142
143         // Do computation 2
144         for(int j = 0; j<l2; j++) {
145           count+=val*j*j;
146         }
147         //Time at Point7
148         lt[eventcount].event = 7;
149         lt[eventcount++].time  = System.getticks();
150
151         // Write values 
152         mainobj[index] = count;
153       }
154       //Time at Point8
155       lt[eventcount].event = 8;
156       lt[eventcount++].time  = System.getticks();
157     }
158     //Time at Point9
159     lt[eventcount].event = 9;
160     lt[eventcount++].time  = System.getticks();
161
162     //Output to file
163     FileOutputStream fo = new FileOutputStream("test_"+threadid);
164     //test output to file
165     char a = 'a';
166     fo.write(a);
167   }
168
169   /*
170    * Convert int to a byte array 
171    **/
172   public byte[] fillBytes(int key) {
173     byte[] b = new byte[4];
174     for(int i = 0; i < 4; i++){
175       int offset = (3-i) * 8;
176       b[i] = (byte) ((key >> offset) & 0xFF);
177     }
178     //
179     // Debug
180     // System.println("Sending b[0]= "+ (char) b[0]);
181     //
182     return b;
183   }
184
185
186   public static void main(String[] args) {
187     SingleObjectMod som = new SingleObjectMod();
188     SingleObjectMod.parseCmdLine(args, som);
189     som.mainobj = new intwrapper[som.arrysize];
190
191
192     Random rand = new Random();
193     rand.random_alloc();
194
195     for(int i = 0; i<som.arrysize; i++) {
196       som.mainobj[i] = i;
197     }
198
199     int nthreads = som.nthreads;
200     System.out.println("Num threads= "+ nthreads);
201
202     SingleObjectMod[] mysom = new SingleObjectMod[nthreads];
203     for(int i = 0; i < nthreads; i++) {
204       mysom[i] = new SingleObjectMod(nthreads, som.arrysize, som.loopsize, som.lsize1, som.lsize2, som.prob, i, som.mainobj, rand);
205     }
206
207     for(int i = 0; i < nthreads; i++) {
208       mysom[i].start();
209     }
210
211     for(int i = 0; i < nthreads; i++) {
212       mysom[i].join();
213     }
214
215     System.out.println("Finished......");
216     System.exit(0);
217   }
218 }
219
220 public class LogTime {
221   public int event;
222   public long time;
223
224   public LogTime() {
225     event = 0;
226     time = 0;
227   }
228 }