xref: /petsc/src/benchmarks/Index.c (revision 029af93f72d387caa45cf6909ac9aed2d04296ca)
1c9a02da4SSatish Balay #ifndef lint
2*029af93fSBarry Smith static char vcid[] = "$Id: Index.c,v 1.13 1997/03/09 18:00:35 bsmith Exp bsmith $";
3c9a02da4SSatish Balay #endif
41f480b34SSatish Balay 
51f480b34SSatish Balay #include "stdio.h"
61f480b34SSatish Balay #include "petsc.h"
71f480b34SSatish Balay #include "sys.h"
81f480b34SSatish Balay 
977c4ece6SBarry Smith int BlastCache();
1007b89f8fSSatish Balay int test1();
1107b89f8fSSatish Balay int test2();
1277c4ece6SBarry Smith 
131f480b34SSatish Balay int main( int argc, char **argv)
141f480b34SSatish Balay {
1577c4ece6SBarry Smith   PetscInitialize(&argc, &argv,0,0);
161f480b34SSatish Balay 
1777c4ece6SBarry Smith   test1();
1877c4ece6SBarry Smith   test2();
1977c4ece6SBarry Smith 
2077c4ece6SBarry Smith   PetscFinalize();
2177c4ece6SBarry Smith   return 0;
2277c4ece6SBarry Smith }
2377c4ece6SBarry Smith 
2477c4ece6SBarry Smith int test1()
2577c4ece6SBarry Smith {
2647794344SBarry Smith   PLogDouble  t1, t2;
2747794344SBarry Smith   double      value;
282758efb8SSatish Balay   int         i, ierr,*z,*zi, intval;
2977c4ece6SBarry Smith   Scalar      *x, *y;
3077c4ece6SBarry Smith   PetscRandom r;
3177c4ece6SBarry Smith 
32*029af93fSBarry Smith   ierr = PetscRandomCreate(PETSC_COMM_SELF,RANDOM_DEFAULT,&r); CHKERRQ(ierr);
3377c4ece6SBarry Smith   x    = (Scalar *)PetscMalloc(20000*sizeof(Scalar)); CHKPTRA(x);
3477c4ece6SBarry Smith   y    = (Scalar *)PetscMalloc(20000*sizeof(Scalar)); CHKPTRA(y);
3577c4ece6SBarry Smith 
3677c4ece6SBarry Smith   z     = (int *)PetscMalloc(2000*sizeof(int)); CHKPTRA(z);
3777c4ece6SBarry Smith   zi    = (int *)PetscMalloc(2000*sizeof(int)); CHKPTRA(zi);
3877c4ece6SBarry Smith 
3977c4ece6SBarry Smith 
401f480b34SSatish Balay 
411f480b34SSatish Balay   /* Take care of paging effects */
421f480b34SSatish Balay   t1 = PetscGetTime();
431f480b34SSatish Balay 
441f480b34SSatish Balay    /* Form the random set of integers */
4577c4ece6SBarry Smith   for (i=0; i<2000; i++) {
4677c4ece6SBarry Smith     ierr   = PetscRandomGetValue(r, &value); CHKERRQ(ierr);
4777c4ece6SBarry Smith     intval = (int)(value*20000.0);
48c9a02da4SSatish Balay     z[i]   = intval;
491f480b34SSatish Balay   }
501f480b34SSatish Balay 
5177c4ece6SBarry Smith   for (i=0; i<2000; i++) {
5277c4ece6SBarry Smith     ierr   = PetscRandomGetValue(r, &value); CHKERRQ(ierr);
5377c4ece6SBarry Smith     intval = (int)(value*20000.0);
54c9a02da4SSatish Balay     z[i]   = intval;
5577c4ece6SBarry Smith   }
5677c4ece6SBarry Smith   fprintf(stderr,"Done setup\n");
5777c4ece6SBarry Smith 
5877c4ece6SBarry Smith   BlastCache();
591f480b34SSatish Balay 
601f480b34SSatish Balay   t1 = PetscGetTime();
6177c4ece6SBarry Smith   for (i=0; i<2000; i++) {  x[i] = y[i]; }
621f480b34SSatish Balay   t2 = PetscGetTime();
6377c4ece6SBarry Smith   fprintf(stderr,"%-19s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0);
641f480b34SSatish Balay 
6577c4ece6SBarry Smith   BlastCache();
661f480b34SSatish Balay 
671f480b34SSatish Balay   t1 = PetscGetTime();
68608f96ebSSatish Balay   for (i=0; i<500; i+=4) {
69608f96ebSSatish Balay     x[i]   = y[z[i]];
70608f96ebSSatish Balay     x[1+i] = y[z[1+i]];
71608f96ebSSatish Balay     x[2+i] = y[z[2+i]];
72608f96ebSSatish Balay     x[3+i] = y[z[3+i]];
73608f96ebSSatish Balay   }
74608f96ebSSatish Balay   t2 = PetscGetTime();
75608f96ebSSatish Balay   fprintf(stderr,"%-19s : %e sec\n","x[i] = y[idx[i]] - unroll 4",(t2-t1)/2000.0);
76608f96ebSSatish Balay 
77608f96ebSSatish Balay   BlastCache();
78608f96ebSSatish Balay 
79608f96ebSSatish Balay   t1 = PetscGetTime();
8077c4ece6SBarry Smith   for (i=0; i<2000; i++) {  x[i] = y[z[i]]; }
811f480b34SSatish Balay   t2 = PetscGetTime();
8277c4ece6SBarry Smith   fprintf(stderr,"%-19s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0);
8377c4ece6SBarry Smith 
8477c4ece6SBarry Smith   BlastCache();
851f480b34SSatish Balay 
861f480b34SSatish Balay   t1 = PetscGetTime();
87608f96ebSSatish Balay   for (i=0; i<1000; i+=2) {  x[i] = y[z[i]];  x[1+i] = y[z[1+i]]; }
88608f96ebSSatish Balay   t2 = PetscGetTime();
89608f96ebSSatish Balay   fprintf(stderr,"%-19s : %e sec\n","x[i] = y[idx[i]] - unroll 2",(t2-t1)/2000.0);
90608f96ebSSatish Balay 
91608f96ebSSatish Balay   BlastCache();
92608f96ebSSatish Balay 
93608f96ebSSatish Balay   t1 = PetscGetTime();
9477c4ece6SBarry Smith   for (i=0; i<2000; i++) {  x[z[i]] = y[i]; }
951f480b34SSatish Balay   t2 = PetscGetTime();
9677c4ece6SBarry Smith   fprintf(stderr,"%-19s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0);
971f480b34SSatish Balay 
9877c4ece6SBarry Smith   BlastCache();
9977c4ece6SBarry Smith 
10077c4ece6SBarry Smith   t1 = PetscGetTime();
10177c4ece6SBarry Smith   for (i=0; i<2000; i++) {  x[z[i]] = y[zi[i]]; }
10277c4ece6SBarry Smith   t2 = PetscGetTime();
10377c4ece6SBarry Smith   fprintf(stderr,"%-19s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0);
10477c4ece6SBarry Smith 
105608f96ebSSatish Balay   PetscMemcpy(x,y,10);
106608f96ebSSatish Balay   PetscMemcpy(z,zi,10);
10777c4ece6SBarry Smith   PetscFree(z);
10877c4ece6SBarry Smith   PetscFree(zi);
10977c4ece6SBarry Smith   PetscFree(x);
11077c4ece6SBarry Smith   PetscFree(y);
11177c4ece6SBarry Smith   PetscRandomDestroy(r);
11277c4ece6SBarry Smith   return 0;
11377c4ece6SBarry Smith }
11477c4ece6SBarry Smith 
11577c4ece6SBarry Smith int test2()
11677c4ece6SBarry Smith {
11747794344SBarry Smith   PLogDouble   t1, t2;
11847794344SBarry Smith   double       value;
11977c4ece6SBarry Smith   int          i, ierr,z[2000],zi[20000], intval, tmp;
12077c4ece6SBarry Smith   Scalar       x[20000], y[20000];
12177c4ece6SBarry Smith   PetscRandom  r;
12277c4ece6SBarry Smith 
123*029af93fSBarry Smith   ierr = PetscRandomCreate(PETSC_COMM_SELF,RANDOM_DEFAULT,&r); CHKERRQ(ierr);
12477c4ece6SBarry Smith 
12577c4ece6SBarry Smith   /* Take care of paging effects */
12677c4ece6SBarry Smith   t1 = PetscGetTime();
12777c4ece6SBarry Smith 
12877c4ece6SBarry Smith   for (i=0; i<2000; i++) {
12977c4ece6SBarry Smith     zi[i] = i;
13077c4ece6SBarry Smith     z[i]  = i;
13177c4ece6SBarry Smith   }
13277c4ece6SBarry Smith 
13377c4ece6SBarry Smith   for (i=0; i<20000; i++) {
13477c4ece6SBarry Smith     x[i] = i;
13577c4ece6SBarry Smith     y[i]  = i;
13677c4ece6SBarry Smith   }
13777c4ece6SBarry Smith 
13877c4ece6SBarry Smith    /* Form the random set of integers */
13977c4ece6SBarry Smith   for (i=0; i<2000; i++) {
14077c4ece6SBarry Smith     ierr   = PetscRandomGetValue(r, &value); CHKERRQ(ierr);
14177c4ece6SBarry Smith     intval = (int)(value*20000.0);
14277c4ece6SBarry Smith     tmp    = z[i];
14377c4ece6SBarry Smith     z[i]   = z[intval];
14477c4ece6SBarry Smith     z[intval] = tmp;
14577c4ece6SBarry Smith   }
14677c4ece6SBarry Smith 
14777c4ece6SBarry Smith   for (i=0; i<2000; i++) {
14877c4ece6SBarry Smith     ierr   = PetscRandomGetValue(r, &value); CHKERRQ(ierr);
14977c4ece6SBarry Smith     intval = (int)(value*20000.0);
15077c4ece6SBarry Smith     tmp    = zi[i];
15177c4ece6SBarry Smith     zi[i]  = zi[intval];
15277c4ece6SBarry Smith     zi[intval] = tmp;
15377c4ece6SBarry Smith   }
15477c4ece6SBarry Smith   fprintf(stderr,"Done setup\n");
15577c4ece6SBarry Smith 
15677c4ece6SBarry Smith   /* BlastCache();  */
15777c4ece6SBarry Smith 
15877c4ece6SBarry Smith   t1 = PetscGetTime();
15977c4ece6SBarry Smith   for (i=0; i<2000; i++) {  x[i] = y[i]; }
16077c4ece6SBarry Smith   t2 = PetscGetTime();
16177c4ece6SBarry Smith   fprintf(stderr,"%-19s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0);
16277c4ece6SBarry Smith 
16377c4ece6SBarry Smith   /* BlastCache();  */
16477c4ece6SBarry Smith 
16577c4ece6SBarry Smith   t1 = PetscGetTime();
16677c4ece6SBarry Smith   for (i=0; i<2000; i++) {  y[i] = x[z[i]]; }
16777c4ece6SBarry Smith   t2 = PetscGetTime();
16877c4ece6SBarry Smith   fprintf(stderr,"%-19s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0);
16977c4ece6SBarry Smith 
17077c4ece6SBarry Smith   /* BlastCache(); */
17177c4ece6SBarry Smith 
17277c4ece6SBarry Smith   t1 = PetscGetTime();
17377c4ece6SBarry Smith   for (i=0; i<2000; i++) {  x[z[i]] = y[i]; }
17477c4ece6SBarry Smith   t2 = PetscGetTime();
17577c4ece6SBarry Smith   fprintf(stderr,"%-19s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0);
17677c4ece6SBarry Smith 
17777c4ece6SBarry Smith   /* BlastCache(); */
17877c4ece6SBarry Smith 
17977c4ece6SBarry Smith   t1 = PetscGetTime();
18077c4ece6SBarry Smith   for (i=0; i<2000; i++) {  y[z[i]] = x[zi[i]]; }
18177c4ece6SBarry Smith   t2 = PetscGetTime();
18277c4ece6SBarry Smith   fprintf(stderr,"%-19s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0);
18377c4ece6SBarry Smith 
18477c4ece6SBarry Smith 
18577c4ece6SBarry Smith   PetscRandomDestroy(r);
18677c4ece6SBarry Smith   return 0;
18777c4ece6SBarry Smith }
18877c4ece6SBarry Smith 
18977c4ece6SBarry Smith int BlastCache()
19077c4ece6SBarry Smith {
19177c4ece6SBarry Smith   int    i,n = 1000000;
19277c4ece6SBarry Smith   Scalar *x,*y,*z,*a, *b;
19377c4ece6SBarry Smith 
19407b89f8fSSatish Balay   x = (Scalar *) PetscMalloc(5*n*sizeof(Scalar)); CHKPTRA(x);
19577c4ece6SBarry Smith   y = x + n;
19677c4ece6SBarry Smith   z = y + n;
19777c4ece6SBarry Smith   a = z + n;
19877c4ece6SBarry Smith   b = a + n;
19977c4ece6SBarry Smith 
20077c4ece6SBarry Smith   for ( i=0; i<n; i++ ) {
20177c4ece6SBarry Smith     a[i] = 3.0*x[i] + 2.0*y[i] + 3.3*z[i] - 25.*b[i];
20277c4ece6SBarry Smith   }
20377c4ece6SBarry Smith   for ( i=0; i<n; i++ ) {
20477c4ece6SBarry Smith     b[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i];
20577c4ece6SBarry Smith   }
20677c4ece6SBarry Smith   for ( i=0; i<n; i++ ) {
20777c4ece6SBarry Smith     z[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i];
20877c4ece6SBarry Smith   }
20977c4ece6SBarry Smith   PetscFree(x);
2101f480b34SSatish Balay   return 0;
2111f480b34SSatish Balay }
212