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