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