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