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