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