1 #ifdef PETSC_RCS_HEADER 2 static char vcid[] = "$Id: Index.c,v 1.16 1997/07/09 21:01:29 balay Exp bsmith $"; 3 #endif 4 5 #include "petsc.h" 6 #include "sys.h" 7 8 int BlastCache(); 9 int test1(); 10 int test2(); 11 12 int main( int argc, char **argv) 13 { 14 PetscInitialize(&argc, &argv,0,0); 15 16 test1(); 17 test2(); 18 19 PetscFinalize(); 20 PetscFunctionReturn(0); 21 } 22 23 int test1() 24 { 25 PLogDouble t1, t2; 26 double value; 27 int i, ierr,*z,*zi, intval; 28 Scalar *x, *y; 29 PetscRandom r; 30 31 ierr = PetscRandomCreate(PETSC_COMM_SELF,RANDOM_DEFAULT,&r); CHKERRQ(ierr); 32 x = (Scalar *)PetscMalloc(20000*sizeof(Scalar)); CHKPTRA(x); 33 y = (Scalar *)PetscMalloc(20000*sizeof(Scalar)); CHKPTRA(y); 34 35 z = (int *)PetscMalloc(2000*sizeof(int)); CHKPTRA(z); 36 zi = (int *)PetscMalloc(2000*sizeof(int)); CHKPTRA(zi); 37 38 39 40 /* Take care of paging effects */ 41 t1 = PetscGetTime(); 42 43 /* Form the random set of integers */ 44 for (i=0; i<2000; i++) { 45 ierr = PetscRandomGetValue(r, &value); CHKERRQ(ierr); 46 intval = (int)(value*20000.0); 47 z[i] = intval; 48 } 49 50 for (i=0; i<2000; i++) { 51 ierr = PetscRandomGetValue(r, &value); CHKERRQ(ierr); 52 intval = (int)(value*20000.0); 53 zi[i] = intval; 54 } 55 fprintf(stderr,"Done setup\n"); 56 57 BlastCache(); 58 59 t1 = PetscGetTime(); 60 for (i=0; i<2000; i++) { x[i] = y[i]; } 61 t2 = PetscGetTime(); 62 fprintf(stderr,"%-19s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0); 63 64 BlastCache(); 65 66 t1 = PetscGetTime(); 67 for (i=0; i<500; i+=4) { 68 x[i] = y[z[i]]; 69 x[1+i] = y[z[1+i]]; 70 x[2+i] = y[z[2+i]]; 71 x[3+i] = y[z[3+i]]; 72 } 73 t2 = PetscGetTime(); 74 fprintf(stderr,"%-19s : %e sec\n","x[i] = y[idx[i]] - unroll 4",(t2-t1)/2000.0); 75 76 BlastCache(); 77 78 t1 = PetscGetTime(); 79 for (i=0; i<2000; i++) { x[i] = y[z[i]]; } 80 t2 = PetscGetTime(); 81 fprintf(stderr,"%-19s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0); 82 83 BlastCache(); 84 85 t1 = PetscGetTime(); 86 for (i=0; i<1000; i+=2) { x[i] = y[z[i]]; x[1+i] = y[z[1+i]]; } 87 t2 = PetscGetTime(); 88 fprintf(stderr,"%-19s : %e sec\n","x[i] = y[idx[i]] - unroll 2",(t2-t1)/2000.0); 89 90 BlastCache(); 91 92 t1 = PetscGetTime(); 93 for (i=0; i<2000; i++) { x[z[i]] = y[i]; } 94 t2 = PetscGetTime(); 95 fprintf(stderr,"%-19s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0); 96 97 BlastCache(); 98 99 t1 = PetscGetTime(); 100 for (i=0; i<2000; i++) { x[z[i]] = y[zi[i]]; } 101 t2 = PetscGetTime(); 102 fprintf(stderr,"%-19s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0); 103 104 PetscMemcpy(x,y,10); 105 PetscMemcpy(z,zi,10); 106 PetscFree(z); 107 PetscFree(zi); 108 PetscFree(x); 109 PetscFree(y); 110 PetscRandomDestroy(r); 111 PetscFunctionReturn(0); 112 } 113 114 int test2() 115 { 116 PLogDouble t1, t2; 117 double value; 118 int i, ierr,z[2000],zi[20000], intval, tmp; 119 Scalar x[20000], y[20000]; 120 PetscRandom r; 121 122 ierr = PetscRandomCreate(PETSC_COMM_SELF,RANDOM_DEFAULT,&r); CHKERRQ(ierr); 123 124 /* Take care of paging effects */ 125 t1 = PetscGetTime(); 126 127 for (i=0; i<2000; i++) { 128 zi[i] = i; 129 z[i] = i; 130 } 131 132 for (i=0; i<20000; i++) { 133 x[i] = i; 134 y[i] = i; 135 } 136 137 /* Form the random set of integers */ 138 for (i=0; i<2000; i++) { 139 ierr = PetscRandomGetValue(r, &value); CHKERRQ(ierr); 140 intval = (int)(value*20000.0); 141 tmp = z[i]; 142 z[i] = z[intval]; 143 z[intval] = tmp; 144 } 145 146 for (i=0; i<2000; i++) { 147 ierr = PetscRandomGetValue(r, &value); CHKERRQ(ierr); 148 intval = (int)(value*20000.0); 149 tmp = zi[i]; 150 zi[i] = zi[intval]; 151 zi[intval] = tmp; 152 } 153 fprintf(stderr,"Done setup\n"); 154 155 /* BlastCache(); */ 156 157 t1 = PetscGetTime(); 158 for (i=0; i<2000; i++) { x[i] = y[i]; } 159 t2 = PetscGetTime(); 160 fprintf(stderr,"%-19s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0); 161 162 /* BlastCache(); */ 163 164 t1 = PetscGetTime(); 165 for (i=0; i<2000; i++) { y[i] = x[z[i]]; } 166 t2 = PetscGetTime(); 167 fprintf(stderr,"%-19s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0); 168 169 /* BlastCache(); */ 170 171 t1 = PetscGetTime(); 172 for (i=0; i<2000; i++) { x[z[i]] = y[i]; } 173 t2 = PetscGetTime(); 174 fprintf(stderr,"%-19s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0); 175 176 /* BlastCache(); */ 177 178 t1 = PetscGetTime(); 179 for (i=0; i<2000; i++) { y[z[i]] = x[zi[i]]; } 180 t2 = PetscGetTime(); 181 fprintf(stderr,"%-19s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0); 182 183 184 PetscRandomDestroy(r); 185 PetscFunctionReturn(0); 186 } 187 188 int BlastCache() 189 { 190 int i,n = 1000000; 191 Scalar *x,*y,*z,*a, *b; 192 193 x = (Scalar *) PetscMalloc(5*n*sizeof(Scalar)); CHKPTRA(x); 194 y = x + n; 195 z = y + n; 196 a = z + n; 197 b = a + n; 198 199 for ( i=0; i<n; i++ ) { 200 a[i] = (Scalar) i; 201 y[i] = (Scalar) i; 202 z[i] = (Scalar) i; 203 b[i] = (Scalar) i; 204 x[i] = (Scalar) i; 205 } 206 207 for ( i=0; i<n; i++ ) { 208 a[i] = 3.0*x[i] + 2.0*y[i] + 3.3*z[i] - 25.*b[i]; 209 } 210 for ( i=0; i<n; i++ ) { 211 b[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i]; 212 } 213 for ( i=0; i<n; i++ ) { 214 z[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i]; 215 } 216 PetscFree(x); 217 PetscFunctionReturn(0); 218 } 219