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