xref: /petsc/src/benchmarks/Index.c (revision 030f984af8d8bb4c203755d35bded3c05b3d83ce)
1 
2 #include <petscsys.h>
3 #include <petsctime.h>
4 
5 extern int BlastCache(void);
6 extern int test1(void);
7 extern int test2(void);
8 
9 int main(int argc,char **argv)
10 {
11   PetscErrorCode ierr;
12 
13   ierr = PetscInitialize(&argc,&argv,0,0);if (ierr) return ierr;
14   ierr = test1();CHKERRQ(ierr);
15   ierr = test2();CHKERRQ(ierr);
16   ierr = PetscFinalize();
17   return ierr;
18 }
19 
20 int test1(void)
21 {
22   PetscLogDouble t1,t2;
23   double         value;
24   int            i,ierr,*z,*zi,intval;
25   PetscScalar    *x,*y;
26   PetscRandom    r;
27 
28   ierr = PetscRandomCreate(PETSC_COMM_SELF,&r);CHKERRQ(ierr);
29   ierr = PetscRandomSetFromOptions(r);CHKERRQ(ierr);
30   ierr = PetscMalloc1(20000,&x);CHKERRQ(ierr);
31   ierr = PetscMalloc1(20000,&y);CHKERRQ(ierr);
32 
33   ierr = PetscMalloc1(2000,&z);CHKERRQ(ierr);
34   ierr = PetscMalloc1(2000,&zi);CHKERRQ(ierr);
35 
36   /* Take care of paging effects */
37   ierr = PetscTime(&t1);CHKERRQ(ierr);
38 
39   /* Form the random set of integers */
40   for (i=0; i<2000; i++) {
41     ierr   = PetscRandomGetValue(r,&value);CHKERRQ(ierr);
42     intval = (int)(value*20000.0);
43     z[i]   = intval;
44   }
45 
46   for (i=0; i<2000; i++) {
47     ierr   = PetscRandomGetValue(r,&value);CHKERRQ(ierr);
48     intval = (int)(value*20000.0);
49     zi[i]  = intval;
50   }
51   /* fprintf(stdout,"Done setup\n"); */
52 
53   ierr = BlastCache();CHKERRQ(ierr);
54 
55   ierr = PetscTime(&t1);CHKERRQ(ierr);
56   for (i=0; i<2000; i++) x[i] = y[i];
57   ierr = PetscTime(&t2);CHKERRQ(ierr);
58   fprintf(stdout,"%-27s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0);
59 
60   ierr = BlastCache();CHKERRQ(ierr);
61 
62   ierr = PetscTime(&t1);CHKERRQ(ierr);
63   for (i=0; i<500; i+=4) {
64     x[i]   = y[z[i]];
65     x[1+i] = y[z[1+i]];
66     x[2+i] = y[z[2+i]];
67     x[3+i] = y[z[3+i]];
68   }
69   ierr = PetscTime(&t2);CHKERRQ(ierr);
70   fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]] - unroll 4",(t2-t1)/2000.0);
71 
72   ierr = BlastCache();CHKERRQ(ierr);
73 
74   ierr = PetscTime(&t1);CHKERRQ(ierr);
75   for (i=0; i<2000; i++) x[i] = y[z[i]];
76   ierr = PetscTime(&t2);CHKERRQ(ierr);
77   fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0);
78 
79   ierr = BlastCache();CHKERRQ(ierr);
80 
81   ierr = PetscTime(&t1);CHKERRQ(ierr);
82   for (i=0; i<1000; i+=2) {  x[i] = y[z[i]];  x[1+i] = y[z[1+i]]; }
83   ierr = PetscTime(&t2);CHKERRQ(ierr);
84   fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]] - unroll 2",(t2-t1)/2000.0);
85 
86   ierr = BlastCache();CHKERRQ(ierr);
87 
88   ierr = PetscTime(&t1);CHKERRQ(ierr);
89   for (i=0; i<2000; i++) x[z[i]] = y[i];
90   ierr = PetscTime(&t2);CHKERRQ(ierr);
91   fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0);
92 
93   ierr = BlastCache();CHKERRQ(ierr);
94 
95   ierr = PetscTime(&t1);CHKERRQ(ierr);
96   for (i=0; i<2000; i++) x[z[i]] = y[zi[i]];
97   ierr = PetscTime(&t2);CHKERRQ(ierr);
98   fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0);
99 
100   ierr = PetscArraycpy(x,y,10);CHKERRQ(ierr);
101   ierr = PetscArraycpy(z,zi,10);CHKERRQ(ierr);
102   ierr = PetscFree(z);CHKERRQ(ierr);
103   ierr = PetscFree(zi);CHKERRQ(ierr);
104   ierr = PetscFree(x);CHKERRQ(ierr);
105   ierr = PetscFree(y);CHKERRQ(ierr);
106   ierr = PetscRandomDestroy(&r);CHKERRQ(ierr);
107   PetscFunctionReturn(0);
108 }
109 
110 int test2(void)
111 {
112   PetscLogDouble t1,t2;
113   double         value;
114   int            i,ierr,z[20000],zi[20000],intval,tmp;
115   PetscScalar    x[20000],y[20000];
116   PetscRandom    r;
117 
118   ierr = PetscRandomCreate(PETSC_COMM_SELF,&r);CHKERRQ(ierr);
119   ierr = PetscRandomSetFromOptions(r);CHKERRQ(ierr);
120 
121   /* Take care of paging effects */
122   ierr = PetscTime(&t1);CHKERRQ(ierr);
123 
124   for (i=0; i<20000; i++) {
125     x[i]  = i;
126     y[i]  = i;
127     z[i]  = i;
128     zi[i] = i;
129   }
130 
131   /* Form the random set of integers */
132   for (i=0; i<20000; i++) {
133     ierr      = PetscRandomGetValue(r,&value);CHKERRQ(ierr);
134     intval    = (int)(value*20000.0);
135     tmp       = z[i];
136     z[i]      = z[intval];
137     z[intval] = tmp;
138   }
139 
140   for (i=0; i<20000; i++) {
141     ierr       = PetscRandomGetValue(r,&value);CHKERRQ(ierr);
142     intval     = (int)(value*20000.0);
143     tmp        = zi[i];
144     zi[i]      = zi[intval];
145     zi[intval] = tmp;
146   }
147   /* fprintf(stdout,"Done setup\n"); */
148 
149   /* ierr = BlastCache();CHKERRQ(ierr); */
150 
151   ierr = PetscTime(&t1);CHKERRQ(ierr);
152   for (i=0; i<2000; i++) x[i] = y[i];
153   ierr = PetscTime(&t2);CHKERRQ(ierr);
154   fprintf(stdout,"%-27s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0);
155 
156   /* ierr = BlastCache();CHKERRQ(ierr); */
157 
158   ierr = PetscTime(&t1);CHKERRQ(ierr);
159   for (i=0; i<2000; i++) y[i] = x[z[i]];
160   ierr = PetscTime(&t2);CHKERRQ(ierr);
161   fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0);
162 
163   /* ierr = BlastCache();CHKERRQ(ierr); */
164 
165   ierr = PetscTime(&t1);CHKERRQ(ierr);
166   for (i=0; i<2000; i++) x[z[i]] = y[i];
167   ierr = PetscTime(&t2);CHKERRQ(ierr);
168   fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0);
169 
170   /* ierr = BlastCache();CHKERRQ(ierr); */
171 
172   ierr = PetscTime(&t1);CHKERRQ(ierr);
173   for (i=0; i<2000; i++) y[z[i]] = x[zi[i]];
174   ierr = PetscTime(&t2);CHKERRQ(ierr);
175   fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0);
176 
177   ierr = PetscRandomDestroy(&r);CHKERRQ(ierr);
178   PetscFunctionReturn(0);
179 }
180 
181 int BlastCache(void)
182 {
183   int         i,ierr,n = 1000000;
184   PetscScalar *x,*y,*z,*a,*b;
185 
186   ierr = PetscMalloc1(5*n,&x);CHKERRQ(ierr);
187   y    = x + n;
188   z    = y + n;
189   a    = z + n;
190   b    = a + n;
191 
192   for (i=0; i<n; i++) {
193     a[i] = (PetscScalar) i;
194     y[i] = (PetscScalar) i;
195     z[i] = (PetscScalar) i;
196     b[i] = (PetscScalar) i;
197     x[i] = (PetscScalar) i;
198   }
199 
200   for (i=0; i<n; i++) a[i] = 3.0*x[i] + 2.0*y[i] + 3.3*z[i] - 25.*b[i];
201   for (i=0; i<n; i++) b[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i];
202   for (i=0; i<n; i++) z[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i];
203   ierr = PetscFree(x);CHKERRQ(ierr);
204   PetscFunctionReturn(0);
205 }
206