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