1. Added new 2DConv 15 X 15 kernel size
[IRC.git] / Robust / src / Benchmarks / Prefetch / 2DConv / javasingle / ConvolutionSizeB.java
1 public class Convolution extends Thread {
2   Image img;
3   int x0,x1,y0,y1;
4
5   public Convolution(Image img, int x0, int x1, int y0, int y1) {
6     this.img = img;
7     this.x0 = x0;
8     this.x1 = x1;
9     this.y0 = y0;
10     this.y1 = y1;
11   }
12
13   public void run() {
14     int kernelHeight=11;
15     int kernelWidth=11;
16
17     double[][] kernel = new double[kernelHeight][kernelWidth];
18     initKernel11(kernel);
19
20     double tempinput[][] = img.inputImage;
21     double tempout[][] = img.outputImage;
22
23     double tinput1[] = tempinput[x0];
24     double tinput2[] = tempinput[x0+1];
25     double tinput3[] = tempinput[x0+2];
26     double tinput4[] = tempinput[x0+3];
27     double tinput5[] = tempinput[x0+4];
28     double tinput6[] = tempinput[x0+5];
29     double tinput7[] = tempinput[x0+6];
30     double tinput8[] = tempinput[x0+7];
31     double tinput9[] = tempinput[x0+8];
32     double tinput10[] = tempinput[x0+9];
33     double tinput0[] = tinput1;
34
35     int l=x0+10;
36     for(int i=x0;i<x1;i++,l++){
37       double tout[] = tempout[i];
38       tinput0 = tinput1; tinput1=tinput2; tinput2=tinput3; tinput3=tinput4; tinput4=tinput5;
39       tinput5 = tinput6; tinput6=tinput7; tinput7=tinput8; tinput8=tinput9; tinput9=tinput10; tinput10=tempinput[l];
40       for(int j=y0;j<y1;++j){
41         double s=0;
42         for(int b=0;b<kernelHeight;++b) {
43           s+=(tinput0[j+b] * kernel[0][b] + tinput1[j+b] * kernel[1][b] + tinput2[j+b]*kernel[2][b] +
44               tinput3[j+b]*kernel[3][b] + tinput4[j+b]*kernel[4][b] + tinput5[j+b]*kernel[5][b]+ 
45               tinput6[j+b]*kernel[6][b] + tinput7[j+b]*kernel[7][b] + tinput8[j+b]*kernel[8][b]+
46               tinput9[j+b]*kernel[9][b] + tinput10[j+b]*kernel[10][b]);
47         }
48           tout[j]=s;
49       }
50     }
51   }
52
53   public static void main(String[] args) {
54     int SIZE = 256;
55     int NUM_THREADS = 1;
56     int kernelHeight=11, kernelWidth=11;
57
58     if(args.length>0) {
59       NUM_THREADS = Integer.parseInt(args[0]);
60       if(args.length>1) {
61         SIZE = Integer.parseInt(args[1]);
62       }
63     }
64
65     Image img;
66     Convolution[] conv;
67     Convolution tmp;
68
69     img = new Image(SIZE,SIZE,kernelHeight,kernelWidth);
70     img.setValues();
71     conv = new Convolution[NUM_THREADS];
72     int increment=SIZE/NUM_THREADS;
73     int base = 0;
74     for(int i = 0; i<NUM_THREADS; i++) {
75       if((i+1)==NUM_THREADS)
76         conv[i] = new Convolution(img, base, SIZE, 0, SIZE);
77       else 
78         conv[i] = new Convolution(img, base, base+increment, 0, SIZE);
79       base+=increment;
80     }
81
82     /*
83     System.printString("img.outputImage[10][20] = " +(int) img.outputImage[10][20] + "\n");
84     System.printString("img.outputImage[256][890] = " +(int) img.outputImage[256][890] + "\n");
85     */
86
87         System.printString("Convolution: Size=");
88     System.printInt(SIZE);
89         System.printString("\n");
90
91     for(int i = 0; i <NUM_THREADS; i++) {
92       tmp = conv[i];
93       tmp.run();
94     }
95
96     /*
97     System.printString("img.outputImage[10][20] = " +(int) img.outputImage[10][20] + "\n");
98     System.printString("img.outputImage[256][890] = " +(int) img.outputImage[256][890] + "\n");
99     */
100     System.printString("2DConv Done!\n");
101   }
102
103   //define 11X11 Gaussian kernel
104   public static void initKernel11(double[][] kernel) {
105     kernel[0][0] = 1/256.0;
106     kernel[0][1] = 4/256.0;
107     kernel[0][2] = 6/256.0;
108     kernel[0][3] = 8/256.0;
109     kernel[0][4] = 10/256.0;
110     kernel[0][5] = 12/256.0;
111     kernel[0][6] = 10/256.0;
112     kernel[0][7] = 8/256.0;
113     kernel[0][8] = 6/256.0;
114     kernel[0][9] = 4/256.0;
115     kernel[0][10] = 1/256.0;
116
117     kernel[1][0] = 4/256.0;
118     kernel[1][1] = 16/256.0;
119     kernel[1][2] = 24/256.0;
120     kernel[1][3] = 32/256.0;
121     kernel[1][4] = 40/256.0;
122     kernel[1][5] = 48/256.0;
123     kernel[1][6] = 40/256.0;
124     kernel[1][7] = 32/256.0;
125     kernel[1][8] = 24/256.0;
126     kernel[1][9] = 8/256.0;
127     kernel[1][10] = 4/256.0;
128
129     kernel[2][0] = 6/256.0;
130     kernel[2][1] = 24/256.0;
131     kernel[2][2] = 36/256.0;
132     kernel[2][3] = 48/256.0;
133     kernel[2][4] = 60/256.0;
134     kernel[2][5] = 72/256.0;
135     kernel[2][6] = 60/256.0;
136     kernel[2][7] = 48/256.0;
137     kernel[2][8] = 36/256.0;
138     kernel[2][9] = 24/256.0;
139     kernel[2][10] = 6/256.0;
140
141     kernel[3][0] = 8/256.0;
142     kernel[3][1] = 32/256.0;
143     kernel[3][2] = 48/256.0;
144     kernel[3][3] = 64/256.0;
145     kernel[3][4] = 80/256.0;
146     kernel[3][5] = 96/256.0;
147     kernel[3][6] = 80/256.0;
148     kernel[3][7] = 64/256.0;
149     kernel[3][8] = 48/256.0;
150     kernel[3][9] = 32/256.0;
151     kernel[3][10] = 8/256.0;
152
153     kernel[4][0] = 10/256.0;
154     kernel[4][1] = 40/256.0;
155     kernel[4][2] = 60/256.0;
156     kernel[4][3] = 80/256.0;
157     kernel[4][4] = 100/256.0;
158     kernel[4][5] = 120/256.0;
159     kernel[4][6] = 100/256.0;
160     kernel[4][7] = 80/256.0;
161     kernel[4][8] = 60/256.0;
162     kernel[4][9] = 40/256.0;
163     kernel[4][10] = 10/256.0;
164
165     kernel[5][0] = 12/256.0;
166     kernel[5][1] = 48/256.0;
167     kernel[5][2] = 72/256.0;
168     kernel[5][3] = 96/256.0;
169     kernel[5][4] = 120/256.0;
170     kernel[5][5] = 144/256.0;
171     kernel[5][6] = 120/256.0;
172     kernel[5][7] = 96/256.0;
173     kernel[5][8] = 72/256.0;
174     kernel[5][9] = 48/256.0;
175     kernel[5][10] = 12/256.0;
176
177     kernel[6][0] = 10/256.0;
178     kernel[6][1] = 40/256.0;
179     kernel[6][2] = 60/256.0;
180     kernel[6][3] = 80/256.0;
181     kernel[6][4] = 100/256.0;
182     kernel[6][5] = 120/256.0;
183     kernel[6][6] = 100/256.0;
184     kernel[6][7] = 80/256.0;
185     kernel[6][8] = 60/256.0;
186     kernel[6][9] = 40/256.0;
187     kernel[6][10] = 10/256.0;
188
189     kernel[7][0] = 8/256.0;
190     kernel[7][1] = 32/256.0;
191     kernel[7][2] = 48/256.0;
192     kernel[7][3] = 64/256.0;
193     kernel[7][4] = 80/256.0;
194     kernel[7][5] = 96/256.0;
195     kernel[7][6] = 80/256.0;
196     kernel[7][7] = 64/256.0;
197     kernel[7][8] = 48/256.0;
198     kernel[7][9] = 32/256.0;
199     kernel[7][10] = 8/256.0;
200
201     kernel[8][0] = 6/256.0;
202     kernel[8][1] = 24/256.0;
203     kernel[8][2] = 36/256.0;
204     kernel[8][3] = 48/256.0;
205     kernel[8][4] = 60/256.0;
206     kernel[8][5] = 72/256.0;
207     kernel[8][6] = 60/256.0;
208     kernel[8][7] = 48/256.0;
209     kernel[8][8] = 36/256.0;
210     kernel[8][9] = 24/256.0;
211     kernel[8][10] = 6/256.0;
212
213     kernel[9][0] = 4/256.0;
214     kernel[9][1] = 8/256.0;
215     kernel[9][2] = 24/256.0;
216     kernel[9][3] = 32/256.0;
217     kernel[9][4] = 40/256.0;
218     kernel[9][5] = 48/256.0;
219     kernel[9][6] = 40/256.0;
220     kernel[9][7] = 32/256.0;
221     kernel[9][8] = 24/256.0;
222     kernel[9][9] = 8/256.0;
223     kernel[9][10] = 4/256.0;
224
225     kernel[10][0] = 1/256.0;
226     kernel[10][1] = 4/256.0;
227     kernel[10][2] = 6/256.0;
228     kernel[10][3] = 8/256.0;
229     kernel[10][4] = 10/256.0;
230     kernel[10][5] = 12/256.0;
231     kernel[10][6] = 10/256.0;
232     kernel[10][7] = 8/256.0;
233     kernel[10][8] = 6/256.0;
234     kernel[10][9] = 4/256.0;
235     kernel[10][10] = 1/256.0;
236   }
237 }
238
239 public class Image {
240   int width, height;
241   int kernelWidth, kernelHeight;
242   double[][] inputImage;
243   double[][] outputImage;
244
245   public Image(int width, int height, int kernelWidth, int kernelHeight) {
246     this.width = width;
247     this.height = height;
248     this.kernelWidth = kernelWidth;
249     this.kernelHeight = kernelHeight;
250     inputImage = new double[height+kernelHeight-1][width+kernelWidth-1];
251     outputImage = new double[height][width];
252   }
253
254   /* Create a valid image */
255   public void setValues() {
256     for (int i = 0; i < (height+kernelHeight - 1); i++) {
257       double ainput[] = inputImage[i];
258       for(int j = 0; j < (width+kernelWidth - 1); j++) {
259         ainput[j] = 256-j;
260       }
261     }
262
263     for (int i = 0; i < height; i++){
264       double aout[] = outputImage[i];
265       for(int j = 0; j < width; j++) {
266         aout[j] = 0;
267       }
268     }
269   }
270 }