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