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