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