xref: /petsc/src/benchmarks/Index.c (revision 70f55243aafb320636e2a54ff30cab5d1e8d3d7b)
1 #ifndef lint
2 static char vcid[] = "$Id: Index.c,v 1.10 1996/05/08 22:29:56 balay Exp balay $";
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   double    t1, t2, value;
27   int       i, ierr,*z,*zi, intval, tmp;
28   Scalar    *x, *y;
29   PetscRandom  r;
30 
31   ierr = PetscRandomCreate(MPI_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     z[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   return 0;
112 }
113 
114 int test2()
115 {
116   double    t1, t2, value;
117   int       i, ierr,z[2000],zi[20000], intval, tmp;
118   Scalar    x[20000], y[20000];
119   PetscRandom  r;
120 
121   ierr = PetscRandomCreate(MPI_COMM_SELF,RANDOM_DEFAULT,&r); CHKERRQ(ierr);
122 
123   /* Take care of paging effects */
124   t1 = PetscGetTime();
125 
126   for (i=0; i<2000; i++) {
127     zi[i] = i;
128     z[i]  = i;
129   }
130 
131   for (i=0; i<20000; i++) {
132     x[i] = i;
133     y[i]  = i;
134   }
135 
136    /* Form the random set of integers */
137   for (i=0; i<2000; i++) {
138     ierr   = PetscRandomGetValue(r, &value); CHKERRQ(ierr);
139     intval = (int)(value*20000.0);
140     tmp    = z[i];
141     z[i]   = z[intval];
142     z[intval] = tmp;
143   }
144 
145   for (i=0; i<2000; i++) {
146     ierr   = PetscRandomGetValue(r, &value); CHKERRQ(ierr);
147     intval = (int)(value*20000.0);
148     tmp    = zi[i];
149     zi[i]  = zi[intval];
150     zi[intval] = tmp;
151   }
152   fprintf(stderr,"Done setup\n");
153 
154   /* BlastCache();  */
155 
156   t1 = PetscGetTime();
157   for (i=0; i<2000; i++) {  x[i] = y[i]; }
158   t2 = PetscGetTime();
159   fprintf(stderr,"%-19s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0);
160 
161   /* BlastCache();  */
162 
163   t1 = PetscGetTime();
164   for (i=0; i<2000; i++) {  y[i] = x[z[i]]; }
165   t2 = PetscGetTime();
166   fprintf(stderr,"%-19s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0);
167 
168   /* BlastCache(); */
169 
170   t1 = PetscGetTime();
171   for (i=0; i<2000; i++) {  x[z[i]] = y[i]; }
172   t2 = PetscGetTime();
173   fprintf(stderr,"%-19s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0);
174 
175   /* BlastCache(); */
176 
177   t1 = PetscGetTime();
178   for (i=0; i<2000; i++) {  y[z[i]] = x[zi[i]]; }
179   t2 = PetscGetTime();
180   fprintf(stderr,"%-19s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0);
181 
182 
183   PetscRandomDestroy(r);
184   return 0;
185 }
186 
187 int BlastCache()
188 {
189   int    i,n = 1000000;
190   Scalar *x,*y,*z,*a, *b;
191 
192   x = (Scalar *) PetscMalloc(5*n*sizeof(Scalar)); CHKPTRA(x);
193   y = x + n;
194   z = y + n;
195   a = z + n;
196   b = a + n;
197 
198   for ( i=0; i<n; i++ ) {
199     a[i] = 3.0*x[i] + 2.0*y[i] + 3.3*z[i] - 25.*b[i];
200   }
201   for ( i=0; i<n; i++ ) {
202     b[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i];
203   }
204   for ( i=0; i<n; i++ ) {
205     z[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i];
206   }
207   PetscFree(x);
208   return 0;
209 }
210