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