1 2 #include <petscsys.h> 3 #include <petsctime.h> 4 5 6 extern int BlastCache(void); 7 extern int test1(void); 8 extern int test2(void); 9 10 #undef __FUNCT__ 11 #define __FUNCT__ "main" 12 int main(int argc,char **argv) 13 { 14 PetscErrorCode ierr; 15 16 PetscInitialize(&argc,&argv,0,0); 17 18 ierr = test1();CHKERRQ(ierr); 19 ierr = test2();CHKERRQ(ierr); 20 21 ierr = PetscFinalize(); 22 PetscFunctionReturn(0); 23 } 24 25 #undef __FUNCT__ 26 #define __FUNCT__ "test1" 27 int test1(void) 28 { 29 PetscLogDouble t1,t2; 30 double value; 31 int i,ierr,*z,*zi,intval; 32 PetscScalar *x,*y; 33 PetscRandom r; 34 35 ierr = PetscRandomCreate(PETSC_COMM_SELF,&r);CHKERRQ(ierr); 36 ierr = PetscRandomSetFromOptions(r);CHKERRQ(ierr); 37 ierr = PetscMalloc1(20000,&x);CHKERRQ(ierr); 38 ierr = PetscMalloc1(20000,&y);CHKERRQ(ierr); 39 40 ierr = PetscMalloc1(2000,&z);CHKERRQ(ierr); 41 ierr = PetscMalloc1(2000,&zi);CHKERRQ(ierr); 42 43 44 45 /* Take care of paging effects */ 46 ierr = PetscTime(&t1);CHKERRQ(ierr); 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 z[i] = intval; 53 } 54 55 for (i=0; i<2000; i++) { 56 ierr = PetscRandomGetValue(r,&value);CHKERRQ(ierr); 57 intval = (int)(value*20000.0); 58 zi[i] = intval; 59 } 60 /* fprintf(stdout,"Done setup\n"); */ 61 62 ierr = BlastCache();CHKERRQ(ierr); 63 64 ierr = PetscTime(&t1);CHKERRQ(ierr); 65 for (i=0; i<2000; i++) x[i] = y[i]; 66 ierr = PetscTime(&t2);CHKERRQ(ierr); 67 fprintf(stdout,"%-27s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0); 68 69 ierr = BlastCache();CHKERRQ(ierr); 70 71 ierr = PetscTime(&t1);CHKERRQ(ierr); 72 for (i=0; i<500; i+=4) { 73 x[i] = y[z[i]]; 74 x[1+i] = y[z[1+i]]; 75 x[2+i] = y[z[2+i]]; 76 x[3+i] = y[z[3+i]]; 77 } 78 ierr = PetscTime(&t2);CHKERRQ(ierr); 79 fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]] - unroll 4",(t2-t1)/2000.0); 80 81 ierr = BlastCache();CHKERRQ(ierr); 82 83 ierr = PetscTime(&t1);CHKERRQ(ierr); 84 for (i=0; i<2000; i++) x[i] = y[z[i]]; 85 ierr = PetscTime(&t2);CHKERRQ(ierr); 86 fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0); 87 88 ierr = BlastCache();CHKERRQ(ierr); 89 90 ierr = PetscTime(&t1);CHKERRQ(ierr); 91 for (i=0; i<1000; i+=2) { x[i] = y[z[i]]; x[1+i] = y[z[1+i]]; } 92 ierr = PetscTime(&t2);CHKERRQ(ierr); 93 fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]] - unroll 2",(t2-t1)/2000.0); 94 95 ierr = BlastCache();CHKERRQ(ierr); 96 97 ierr = PetscTime(&t1);CHKERRQ(ierr); 98 for (i=0; i<2000; i++) x[z[i]] = y[i]; 99 ierr = PetscTime(&t2);CHKERRQ(ierr); 100 fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0); 101 102 ierr = BlastCache();CHKERRQ(ierr); 103 104 ierr = PetscTime(&t1);CHKERRQ(ierr); 105 for (i=0; i<2000; i++) x[z[i]] = y[zi[i]]; 106 ierr = PetscTime(&t2);CHKERRQ(ierr); 107 fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0); 108 109 ierr = PetscMemcpy(x,y,10);CHKERRQ(ierr); 110 ierr = PetscMemcpy(z,zi,10);CHKERRQ(ierr); 111 ierr = PetscFree(z);CHKERRQ(ierr); 112 ierr = PetscFree(zi);CHKERRQ(ierr); 113 ierr = PetscFree(x);CHKERRQ(ierr); 114 ierr = PetscFree(y);CHKERRQ(ierr); 115 ierr = PetscRandomDestroy(&r);CHKERRQ(ierr); 116 PetscFunctionReturn(0); 117 } 118 119 #undef __FUNCT__ 120 #define __FUNCT__ "test2" 121 int test2(void) 122 { 123 PetscLogDouble t1,t2; 124 double value; 125 int i,ierr,z[20000],zi[20000],intval,tmp; 126 PetscScalar x[20000],y[20000]; 127 PetscRandom r; 128 129 ierr = PetscRandomCreate(PETSC_COMM_SELF,&r);CHKERRQ(ierr); 130 ierr = PetscRandomSetFromOptions(r);CHKERRQ(ierr); 131 132 /* Take care of paging effects */ 133 ierr = PetscTime(&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(stdout,"Done setup\n"); */ 159 160 /* ierr = BlastCache();CHKERRQ(ierr); */ 161 162 ierr = PetscTime(&t1);CHKERRQ(ierr); 163 for (i=0; i<2000; i++) x[i] = y[i]; 164 ierr = PetscTime(&t2);CHKERRQ(ierr); 165 fprintf(stdout,"%-27s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0); 166 167 /* ierr = BlastCache();CHKERRQ(ierr); */ 168 169 ierr = PetscTime(&t1);CHKERRQ(ierr); 170 for (i=0; i<2000; i++) y[i] = x[z[i]]; 171 ierr = PetscTime(&t2);CHKERRQ(ierr); 172 fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0); 173 174 /* ierr = BlastCache();CHKERRQ(ierr); */ 175 176 ierr = PetscTime(&t1);CHKERRQ(ierr); 177 for (i=0; i<2000; i++) x[z[i]] = y[i]; 178 ierr = PetscTime(&t2);CHKERRQ(ierr); 179 fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0); 180 181 /* ierr = BlastCache();CHKERRQ(ierr); */ 182 183 ierr = PetscTime(&t1);CHKERRQ(ierr); 184 for (i=0; i<2000; i++) y[z[i]] = x[zi[i]]; 185 ierr = PetscTime(&t2);CHKERRQ(ierr); 186 fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0); 187 188 189 ierr = PetscRandomDestroy(&r);CHKERRQ(ierr); 190 PetscFunctionReturn(0); 191 } 192 193 #undef __FUNCT__ 194 #define __FUNCT__ "BlastCache" 195 int BlastCache(void) 196 { 197 int i,ierr,n = 1000000; 198 PetscScalar *x,*y,*z,*a,*b; 199 200 ierr = PetscMalloc1(5*n,&x);CHKERRQ(ierr); 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] = (PetscScalar) i; 208 y[i] = (PetscScalar) i; 209 z[i] = (PetscScalar) i; 210 b[i] = (PetscScalar) i; 211 x[i] = (PetscScalar) i; 212 } 213 214 for (i=0; i<n; i++) a[i] = 3.0*x[i] + 2.0*y[i] + 3.3*z[i] - 25.*b[i]; 215 for (i=0; i<n; i++) b[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i]; 216 for (i=0; i<n; i++) z[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i]; 217 ierr = PetscFree(x);CHKERRQ(ierr); 218 PetscFunctionReturn(0); 219 } 220