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