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