xref: /petsc/src/benchmarks/Index.c (revision bb1d7374b64f295b2ed5ff23b89435d65e905a54)
1 
2 #include <petscsys.h>
3 #include <petsctime.h>
4 
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   PetscErrorCode ierr;
15 
16   PetscInitialize(&argc,&argv,0,0);
17 
18   ierr = test1();CHKERRQ(ierr);
19   ierr = test2();CHKERRQ(ierr);
20 
21   ierr = PetscFinalize();
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   PetscScalar    *x,*y;
33   PetscRandom    r;
34 
35   ierr = PetscRandomCreate(PETSC_COMM_SELF,&r);CHKERRQ(ierr);
36   ierr = PetscRandomSetFromOptions(r);CHKERRQ(ierr);
37   ierr = PetscMalloc1(20000,&x);CHKERRQ(ierr);
38   ierr = PetscMalloc1(20000,&y);CHKERRQ(ierr);
39 
40   ierr = PetscMalloc1(2000,&z);CHKERRQ(ierr);
41   ierr = PetscMalloc1(2000,&zi);CHKERRQ(ierr);
42 
43 
44 
45   /* Take care of paging effects */
46   ierr = PetscTime(&t1);CHKERRQ(ierr);
47 
48   /* Form the random set of integers */
49   for (i=0; i<2000; i++) {
50     ierr   = PetscRandomGetValue(r,&value);CHKERRQ(ierr);
51     intval = (int)(value*20000.0);
52     z[i]   = intval;
53   }
54 
55   for (i=0; i<2000; i++) {
56     ierr   = PetscRandomGetValue(r,&value);CHKERRQ(ierr);
57     intval = (int)(value*20000.0);
58     zi[i]  = intval;
59   }
60   /* fprintf(stdout,"Done setup\n"); */
61 
62   ierr = BlastCache();CHKERRQ(ierr);
63 
64   ierr = PetscTime(&t1);CHKERRQ(ierr);
65   for (i=0; i<2000; i++) x[i] = y[i];
66   ierr = PetscTime(&t2);CHKERRQ(ierr);
67   fprintf(stdout,"%-27s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0);
68 
69   ierr = BlastCache();CHKERRQ(ierr);
70 
71   ierr = PetscTime(&t1);CHKERRQ(ierr);
72   for (i=0; i<500; i+=4) {
73     x[i]   = y[z[i]];
74     x[1+i] = y[z[1+i]];
75     x[2+i] = y[z[2+i]];
76     x[3+i] = y[z[3+i]];
77   }
78   ierr = PetscTime(&t2);CHKERRQ(ierr);
79   fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]] - unroll 4",(t2-t1)/2000.0);
80 
81   ierr = BlastCache();CHKERRQ(ierr);
82 
83   ierr = PetscTime(&t1);CHKERRQ(ierr);
84   for (i=0; i<2000; i++) x[i] = y[z[i]];
85   ierr = PetscTime(&t2);CHKERRQ(ierr);
86   fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0);
87 
88   ierr = BlastCache();CHKERRQ(ierr);
89 
90   ierr = PetscTime(&t1);CHKERRQ(ierr);
91   for (i=0; i<1000; i+=2) {  x[i] = y[z[i]];  x[1+i] = y[z[1+i]]; }
92   ierr = PetscTime(&t2);CHKERRQ(ierr);
93   fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]] - unroll 2",(t2-t1)/2000.0);
94 
95   ierr = BlastCache();CHKERRQ(ierr);
96 
97   ierr = PetscTime(&t1);CHKERRQ(ierr);
98   for (i=0; i<2000; i++) x[z[i]] = y[i];
99   ierr = PetscTime(&t2);CHKERRQ(ierr);
100   fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0);
101 
102   ierr = BlastCache();CHKERRQ(ierr);
103 
104   ierr = PetscTime(&t1);CHKERRQ(ierr);
105   for (i=0; i<2000; i++) x[z[i]] = y[zi[i]];
106   ierr = PetscTime(&t2);CHKERRQ(ierr);
107   fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0);
108 
109   ierr = PetscMemcpy(x,y,10);CHKERRQ(ierr);
110   ierr = PetscMemcpy(z,zi,10);CHKERRQ(ierr);
111   ierr = PetscFree(z);CHKERRQ(ierr);
112   ierr = PetscFree(zi);CHKERRQ(ierr);
113   ierr = PetscFree(x);CHKERRQ(ierr);
114   ierr = PetscFree(y);CHKERRQ(ierr);
115   ierr = PetscRandomDestroy(&r);CHKERRQ(ierr);
116   PetscFunctionReturn(0);
117 }
118 
119 #undef __FUNCT__
120 #define __FUNCT__ "test2"
121 int test2(void)
122 {
123   PetscLogDouble t1,t2;
124   double         value;
125   int            i,ierr,z[20000],zi[20000],intval,tmp;
126   PetscScalar    x[20000],y[20000];
127   PetscRandom    r;
128 
129   ierr = PetscRandomCreate(PETSC_COMM_SELF,&r);CHKERRQ(ierr);
130   ierr = PetscRandomSetFromOptions(r);CHKERRQ(ierr);
131 
132   /* Take care of paging effects */
133   ierr = PetscTime(&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(stdout,"Done setup\n"); */
159 
160   /* ierr = BlastCache();CHKERRQ(ierr); */
161 
162   ierr = PetscTime(&t1);CHKERRQ(ierr);
163   for (i=0; i<2000; i++) x[i] = y[i];
164   ierr = PetscTime(&t2);CHKERRQ(ierr);
165   fprintf(stdout,"%-27s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0);
166 
167   /* ierr = BlastCache();CHKERRQ(ierr); */
168 
169   ierr = PetscTime(&t1);CHKERRQ(ierr);
170   for (i=0; i<2000; i++) y[i] = x[z[i]];
171   ierr = PetscTime(&t2);CHKERRQ(ierr);
172   fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0);
173 
174   /* ierr = BlastCache();CHKERRQ(ierr); */
175 
176   ierr = PetscTime(&t1);CHKERRQ(ierr);
177   for (i=0; i<2000; i++) x[z[i]] = y[i];
178   ierr = PetscTime(&t2);CHKERRQ(ierr);
179   fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0);
180 
181   /* ierr = BlastCache();CHKERRQ(ierr); */
182 
183   ierr = PetscTime(&t1);CHKERRQ(ierr);
184   for (i=0; i<2000; i++) y[z[i]] = x[zi[i]];
185   ierr = PetscTime(&t2);CHKERRQ(ierr);
186   fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0);
187 
188 
189   ierr = PetscRandomDestroy(&r);CHKERRQ(ierr);
190   PetscFunctionReturn(0);
191 }
192 
193 #undef __FUNCT__
194 #define __FUNCT__ "BlastCache"
195 int BlastCache(void)
196 {
197   int         i,ierr,n = 1000000;
198   PetscScalar *x,*y,*z,*a,*b;
199 
200   ierr = PetscMalloc1(5*n,&x);CHKERRQ(ierr);
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] = (PetscScalar) i;
208     y[i] = (PetscScalar) i;
209     z[i] = (PetscScalar) i;
210     b[i] = (PetscScalar) i;
211     x[i] = (PetscScalar) i;
212   }
213 
214   for (i=0; i<n; i++) a[i] = 3.0*x[i] + 2.0*y[i] + 3.3*z[i] - 25.*b[i];
215   for (i=0; i<n; i++) b[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i];
216   for (i=0; i<n; i++) z[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i];
217   ierr = PetscFree(x);CHKERRQ(ierr);
218   PetscFunctionReturn(0);
219 }
220