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