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