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