xref: /petsc/src/benchmarks/Index.c (revision ea709b57ddb8cc304f11df2e9a39d6a8fdb28b53)
1*ea709b57SSatish Balay /*$Id: Index.c,v 1.32 2001/08/06 21:19:06 bsmith Exp balay $*/
21f480b34SSatish Balay 
31f480b34SSatish Balay #include "petsc.h"
4e090d566SSatish Balay #include "petscsys.h"
51f480b34SSatish Balay 
65a655dc6SBarry Smith extern int BlastCache(void);
75a655dc6SBarry Smith extern int test1(void);
85a655dc6SBarry Smith extern int test2(void);
977c4ece6SBarry Smith 
104a2ae208SSatish Balay #undef __FUNCT__
114a2ae208SSatish Balay #define __FUNCT__ "main"
121f480b34SSatish Balay int main(int argc,char **argv)
131f480b34SSatish Balay {
14d3093643SSatish Balay   int ierr;
15d3093643SSatish Balay 
1677c4ece6SBarry Smith   PetscInitialize(&argc,&argv,0,0);
171f480b34SSatish Balay 
18ac355199SBarry Smith   ierr = test1();CHKERRQ(ierr);
19ac355199SBarry Smith   ierr = test2();CHKERRQ(ierr);
2077c4ece6SBarry Smith 
212b7fea2aSSatish Balay   ierr = PetscFinalize();CHKERRQ(ierr);
223a40ed3dSBarry Smith   PetscFunctionReturn(0);
2377c4ece6SBarry Smith }
2477c4ece6SBarry Smith 
254a2ae208SSatish Balay #undef __FUNCT__
264a2ae208SSatish Balay #define __FUNCT__ "test1"
27cf256101SBarry Smith int test1(void)
2877c4ece6SBarry Smith {
29b0a32e0cSBarry Smith   PetscLogDouble  t1,t2;
3047794344SBarry Smith   double      value;
312758efb8SSatish Balay   int         i,ierr,*z,*zi,intval;
32*ea709b57SSatish Balay   PetscScalar *x,*y;
3377c4ece6SBarry Smith   PetscRandom r;
3477c4ece6SBarry Smith 
35029af93fSBarry Smith   ierr = PetscRandomCreate(PETSC_COMM_SELF,RANDOM_DEFAULT,&r);CHKERRQ(ierr);
3687828ca2SBarry Smith   ierr = PetscMalloc(20000*sizeof(PetscScalar),&x);CHKERRQ(ierr);
3787828ca2SBarry Smith   ierr = PetscMalloc(20000*sizeof(PetscScalar),&y);CHKERRQ(ierr);
3877c4ece6SBarry Smith 
39ac355199SBarry Smith   ierr = PetscMalloc(2000*sizeof(int),&z);CHKERRQ(ierr);
40ac355199SBarry Smith   ierr = PetscMalloc(2000*sizeof(int),&zi);CHKERRQ(ierr);
4177c4ece6SBarry Smith 
4277c4ece6SBarry Smith 
431f480b34SSatish Balay 
441f480b34SSatish Balay   /* Take care of paging effects */
45d3093643SSatish Balay   ierr = PetscGetTime(&t1);CHKERRQ(ierr);
461f480b34SSatish Balay 
471f480b34SSatish Balay    /* Form the random set of integers */
4877c4ece6SBarry Smith   for (i=0; i<2000; i++) {
4977c4ece6SBarry Smith     ierr   = PetscRandomGetValue(r,&value);CHKERRQ(ierr);
5077c4ece6SBarry Smith     intval = (int)(value*20000.0);
51c9a02da4SSatish Balay     z[i]   = intval;
521f480b34SSatish Balay   }
531f480b34SSatish Balay 
5477c4ece6SBarry Smith   for (i=0; i<2000; i++) {
5577c4ece6SBarry Smith     ierr    = PetscRandomGetValue(r,&value);CHKERRQ(ierr);
5677c4ece6SBarry Smith     intval  = (int)(value*20000.0);
57ba8edd79SBarry Smith     zi[i]   = intval;
5877c4ece6SBarry Smith   }
5977c4ece6SBarry Smith   fprintf(stderr,"Done setup\n");
6077c4ece6SBarry Smith 
61d3093643SSatish Balay   ierr = BlastCache();CHKERRQ(ierr);
621f480b34SSatish Balay 
63d3093643SSatish Balay   ierr = PetscGetTime(&t1);CHKERRQ(ierr);
6477c4ece6SBarry Smith   for (i=0; i<2000; i++) {  x[i] = y[i]; }
65d3093643SSatish Balay   ierr = PetscGetTime(&t2);CHKERRQ(ierr);
6677c4ece6SBarry Smith   fprintf(stderr,"%-19s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0);
671f480b34SSatish Balay 
68d3093643SSatish Balay   ierr = BlastCache();CHKERRQ(ierr);
691f480b34SSatish Balay 
70d3093643SSatish Balay   ierr = PetscGetTime(&t1);CHKERRQ(ierr);
71608f96ebSSatish Balay   for (i=0; i<500; i+=4) {
72608f96ebSSatish Balay     x[i]   = y[z[i]];
73608f96ebSSatish Balay     x[1+i] = y[z[1+i]];
74608f96ebSSatish Balay     x[2+i] = y[z[2+i]];
75608f96ebSSatish Balay     x[3+i] = y[z[3+i]];
76608f96ebSSatish Balay   }
77d3093643SSatish Balay   ierr = PetscGetTime(&t2);CHKERRQ(ierr);
78608f96ebSSatish Balay   fprintf(stderr,"%-19s : %e sec\n","x[i] = y[idx[i]] - unroll 4",(t2-t1)/2000.0);
79608f96ebSSatish Balay 
80d3093643SSatish Balay   ierr = BlastCache();CHKERRQ(ierr);
81608f96ebSSatish Balay 
82d3093643SSatish Balay   ierr = PetscGetTime(&t1);CHKERRQ(ierr)
8377c4ece6SBarry Smith   for (i=0; i<2000; i++) {  x[i] = y[z[i]]; }
84d3093643SSatish Balay   ierr = PetscGetTime(&t2);CHKERRQ(ierr);
8577c4ece6SBarry Smith   fprintf(stderr,"%-19s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0);
8677c4ece6SBarry Smith 
87d3093643SSatish Balay   ierr = BlastCache();CHKERRQ(ierr);
881f480b34SSatish Balay 
89d3093643SSatish Balay   ierr = PetscGetTime(&t1);CHKERRQ(ierr);
90608f96ebSSatish Balay   for (i=0; i<1000; i+=2) {  x[i] = y[z[i]];  x[1+i] = y[z[1+i]]; }
91d3093643SSatish Balay   ierr = PetscGetTime(&t2);CHKERRQ(ierr);
92608f96ebSSatish Balay   fprintf(stderr,"%-19s : %e sec\n","x[i] = y[idx[i]] - unroll 2",(t2-t1)/2000.0);
93608f96ebSSatish Balay 
94d3093643SSatish Balay   ierr = BlastCache();CHKERRQ(ierr);
95608f96ebSSatish Balay 
96d3093643SSatish Balay   ierr = PetscGetTime(&t1);CHKERRQ(ierr);
9777c4ece6SBarry Smith   for (i=0; i<2000; i++) {  x[z[i]] = y[i]; }
98d3093643SSatish Balay   ierr = PetscGetTime(&t2);CHKERRQ(ierr);
9977c4ece6SBarry Smith   fprintf(stderr,"%-19s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0);
1001f480b34SSatish Balay 
101d3093643SSatish Balay   ierr = BlastCache();CHKERRQ(ierr);
10277c4ece6SBarry Smith 
103d3093643SSatish Balay   ierr = PetscGetTime(&t1);CHKERRQ(ierr);
10477c4ece6SBarry Smith   for (i=0; i<2000; i++) {  x[z[i]] = y[zi[i]]; }
105d3093643SSatish Balay   ierr = PetscGetTime(&t2);CHKERRQ(ierr);
10677c4ece6SBarry Smith   fprintf(stderr,"%-19s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0);
10777c4ece6SBarry Smith 
108549d3d68SSatish Balay   ierr = PetscMemcpy(x,y,10);CHKERRQ(ierr);
109549d3d68SSatish Balay   ierr = PetscMemcpy(z,zi,10);CHKERRQ(ierr);
110606d414cSSatish Balay   ierr = PetscFree(z);CHKERRQ(ierr);
111606d414cSSatish Balay   ierr = PetscFree(zi);CHKERRQ(ierr);
112606d414cSSatish Balay   ierr = PetscFree(x);CHKERRQ(ierr);
113606d414cSSatish Balay   ierr = PetscFree(y);CHKERRQ(ierr);
11477c4ece6SBarry Smith   PetscRandomDestroy(r);
1153a40ed3dSBarry Smith   PetscFunctionReturn(0);
11677c4ece6SBarry Smith }
11777c4ece6SBarry Smith 
1184a2ae208SSatish Balay #undef __FUNCT__
1194a2ae208SSatish Balay #define __FUNCT__ "test2"
120cf256101SBarry Smith int test2(void)
12177c4ece6SBarry Smith {
122b0a32e0cSBarry Smith   PetscLogDouble   t1,t2;
12347794344SBarry Smith   double       value;
124d3093643SSatish Balay   int          i,ierr,z[20000],zi[20000],intval,tmp;
125*ea709b57SSatish Balay   PetscScalar  x[20000],y[20000];
12677c4ece6SBarry Smith   PetscRandom  r;
12777c4ece6SBarry Smith 
128029af93fSBarry Smith   ierr = PetscRandomCreate(PETSC_COMM_SELF,RANDOM_DEFAULT,&r);CHKERRQ(ierr);
12977c4ece6SBarry Smith 
13077c4ece6SBarry Smith   /* Take care of paging effects */
131d3093643SSatish Balay   ierr = PetscGetTime(&t1);CHKERRQ(ierr);
13277c4ece6SBarry Smith 
13377c4ece6SBarry Smith   for (i=0; i<20000; i++) {
13477c4ece6SBarry Smith     x[i]  = i;
13577c4ece6SBarry Smith     y[i]  = i;
136d3093643SSatish Balay     z[i]  = i;
137d3093643SSatish Balay     zi[i] = i;
13877c4ece6SBarry Smith   }
13977c4ece6SBarry Smith 
14077c4ece6SBarry Smith    /* Form the random set of integers */
141d3093643SSatish Balay   for (i=0; i<20000; i++) {
14277c4ece6SBarry Smith     ierr   = PetscRandomGetValue(r,&value);CHKERRQ(ierr);
14377c4ece6SBarry Smith     intval = (int)(value*20000.0);
14477c4ece6SBarry Smith     tmp    = z[i];
14577c4ece6SBarry Smith     z[i]   = z[intval];
14677c4ece6SBarry Smith     z[intval] = tmp;
14777c4ece6SBarry Smith   }
14877c4ece6SBarry Smith 
149d3093643SSatish Balay   for (i=0; i<20000; i++) {
15077c4ece6SBarry Smith     ierr   = PetscRandomGetValue(r,&value);CHKERRQ(ierr);
15177c4ece6SBarry Smith     intval = (int)(value*20000.0);
15277c4ece6SBarry Smith     tmp    = zi[i];
15377c4ece6SBarry Smith     zi[i]  = zi[intval];
15477c4ece6SBarry Smith     zi[intval] = tmp;
15577c4ece6SBarry Smith   }
15677c4ece6SBarry Smith   fprintf(stderr,"Done setup\n");
15777c4ece6SBarry Smith 
158d3093643SSatish Balay   /* ierr = BlastCache();CHKERRQ(ierr); */
15977c4ece6SBarry Smith 
160d3093643SSatish Balay   ierr = PetscGetTime(&t1);CHKERRQ(ierr);
16177c4ece6SBarry Smith   for (i=0; i<2000; i++) {  x[i] = y[i]; }
162d3093643SSatish Balay   ierr = PetscGetTime(&t2);CHKERRQ(ierr);
16377c4ece6SBarry Smith   fprintf(stderr,"%-19s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0);
16477c4ece6SBarry Smith 
165d3093643SSatish Balay   /* ierr = BlastCache();CHKERRQ(ierr); */
16677c4ece6SBarry Smith 
167d3093643SSatish Balay   ierr = PetscGetTime(&t1);CHKERRQ(ierr);
16877c4ece6SBarry Smith   for (i=0; i<2000; i++) {  y[i] = x[z[i]]; }
169d3093643SSatish Balay   ierr = PetscGetTime(&t2);CHKERRQ(ierr);
17077c4ece6SBarry Smith   fprintf(stderr,"%-19s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0);
17177c4ece6SBarry Smith 
172d3093643SSatish Balay   /* ierr = BlastCache();CHKERRQ(ierr); */
17377c4ece6SBarry Smith 
174d3093643SSatish Balay   ierr = PetscGetTime(&t1);CHKERRQ(ierr);
17577c4ece6SBarry Smith   for (i=0; i<2000; i++) {  x[z[i]] = y[i]; }
176d3093643SSatish Balay   ierr = PetscGetTime(&t2);CHKERRQ(ierr);
17777c4ece6SBarry Smith   fprintf(stderr,"%-19s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0);
17877c4ece6SBarry Smith 
179d3093643SSatish Balay   /* ierr = BlastCache();CHKERRQ(ierr); */
18077c4ece6SBarry Smith 
181d3093643SSatish Balay   ierr = PetscGetTime(&t1);CHKERRQ(ierr);
18277c4ece6SBarry Smith   for (i=0; i<2000; i++) {  y[z[i]] = x[zi[i]]; }
183d3093643SSatish Balay   ierr = PetscGetTime(&t2);CHKERRQ(ierr);
18477c4ece6SBarry Smith   fprintf(stderr,"%-19s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0);
18577c4ece6SBarry Smith 
18677c4ece6SBarry Smith 
18777c4ece6SBarry Smith   PetscRandomDestroy(r);
1883a40ed3dSBarry Smith   PetscFunctionReturn(0);
18977c4ece6SBarry Smith }
19077c4ece6SBarry Smith 
1914a2ae208SSatish Balay #undef __FUNCT__
1924a2ae208SSatish Balay #define __FUNCT__ "BlastCache"
193465d0859SSatish Balay int BlastCache(void)
19477c4ece6SBarry Smith {
19577c4ece6SBarry Smith   int    i,n = 1000000;
196*ea709b57SSatish Balay   PetscScalar *x,*y,*z,*a,*b;
19777c4ece6SBarry Smith 
19887828ca2SBarry Smith   ierr = PetscMalloc(5*n*sizeof(PetscScalar),&x);CHKERRQ(ierr);
19977c4ece6SBarry Smith   y = x + n;
20077c4ece6SBarry Smith   z = y + n;
20177c4ece6SBarry Smith   a = z + n;
20277c4ece6SBarry Smith   b = a + n;
20377c4ece6SBarry Smith 
20477c4ece6SBarry Smith   for (i=0; i<n; i++) {
20587828ca2SBarry Smith     a[i] = (PetscScalar) i;
20687828ca2SBarry Smith     y[i] = (PetscScalar) i;
20787828ca2SBarry Smith     z[i] = (PetscScalar) i;
20887828ca2SBarry Smith     b[i] = (PetscScalar) i;
20987828ca2SBarry Smith     x[i] = (PetscScalar) i;
210ba8edd79SBarry Smith   }
211ba8edd79SBarry Smith 
212ba8edd79SBarry Smith   for (i=0; i<n; i++) {
21377c4ece6SBarry Smith     a[i] = 3.0*x[i] + 2.0*y[i] + 3.3*z[i] - 25.*b[i];
21477c4ece6SBarry Smith   }
21577c4ece6SBarry Smith   for (i=0; i<n; i++) {
21677c4ece6SBarry Smith     b[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i];
21777c4ece6SBarry Smith   }
21877c4ece6SBarry Smith   for (i=0; i<n; i++) {
21977c4ece6SBarry Smith     z[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i];
22077c4ece6SBarry Smith   }
221606d414cSSatish Balay   ierr = PetscFree(x);CHKERRQ(ierr);
2223a40ed3dSBarry Smith   PetscFunctionReturn(0);
2231f480b34SSatish Balay }
224