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