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 CHKERRQ(test1()); 15 CHKERRQ(test2()); 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 CHKERRQ(PetscRandomCreate(PETSC_COMM_SELF,&r)); 29 CHKERRQ(PetscRandomSetFromOptions(r)); 30 CHKERRQ(PetscMalloc1(20000,&x)); 31 CHKERRQ(PetscMalloc1(20000,&y)); 32 33 CHKERRQ(PetscMalloc1(2000,&z)); 34 CHKERRQ(PetscMalloc1(2000,&zi)); 35 36 /* Take care of paging effects */ 37 CHKERRQ(PetscTime(&t1)); 38 39 /* Form the random set of integers */ 40 for (i=0; i<2000; i++) { 41 CHKERRQ(PetscRandomGetValue(r,&value)); 42 intval = (int)(value*20000.0); 43 z[i] = intval; 44 } 45 46 for (i=0; i<2000; i++) { 47 CHKERRQ(PetscRandomGetValue(r,&value)); 48 intval = (int)(value*20000.0); 49 zi[i] = intval; 50 } 51 /* fprintf(stdout,"Done setup\n"); */ 52 53 CHKERRQ(BlastCache()); 54 55 CHKERRQ(PetscTime(&t1)); 56 for (i=0; i<2000; i++) x[i] = y[i]; 57 CHKERRQ(PetscTime(&t2)); 58 fprintf(stdout,"%-27s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0); 59 60 CHKERRQ(BlastCache()); 61 62 CHKERRQ(PetscTime(&t1)); 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 CHKERRQ(PetscTime(&t2)); 70 fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]] - unroll 4",(t2-t1)/2000.0); 71 72 CHKERRQ(BlastCache()); 73 74 CHKERRQ(PetscTime(&t1)); 75 for (i=0; i<2000; i++) x[i] = y[z[i]]; 76 CHKERRQ(PetscTime(&t2)); 77 fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0); 78 79 CHKERRQ(BlastCache()); 80 81 CHKERRQ(PetscTime(&t1)); 82 for (i=0; i<1000; i+=2) { x[i] = y[z[i]]; x[1+i] = y[z[1+i]]; } 83 CHKERRQ(PetscTime(&t2)); 84 fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]] - unroll 2",(t2-t1)/2000.0); 85 86 CHKERRQ(BlastCache()); 87 88 CHKERRQ(PetscTime(&t1)); 89 for (i=0; i<2000; i++) x[z[i]] = y[i]; 90 CHKERRQ(PetscTime(&t2)); 91 fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0); 92 93 CHKERRQ(BlastCache()); 94 95 CHKERRQ(PetscTime(&t1)); 96 for (i=0; i<2000; i++) x[z[i]] = y[zi[i]]; 97 CHKERRQ(PetscTime(&t2)); 98 fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0); 99 100 CHKERRQ(PetscArraycpy(x,y,10)); 101 CHKERRQ(PetscArraycpy(z,zi,10)); 102 CHKERRQ(PetscFree(z)); 103 CHKERRQ(PetscFree(zi)); 104 CHKERRQ(PetscFree(x)); 105 CHKERRQ(PetscFree(y)); 106 CHKERRQ(PetscRandomDestroy(&r)); 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 CHKERRQ(PetscRandomCreate(PETSC_COMM_SELF,&r)); 119 CHKERRQ(PetscRandomSetFromOptions(r)); 120 121 /* Take care of paging effects */ 122 CHKERRQ(PetscTime(&t1)); 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 CHKERRQ(PetscRandomGetValue(r,&value)); 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 CHKERRQ(PetscRandomGetValue(r,&value)); 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 /* CHKERRQ(BlastCache()); */ 150 151 CHKERRQ(PetscTime(&t1)); 152 for (i=0; i<2000; i++) x[i] = y[i]; 153 CHKERRQ(PetscTime(&t2)); 154 fprintf(stdout,"%-27s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0); 155 156 /* CHKERRQ(BlastCache()); */ 157 158 CHKERRQ(PetscTime(&t1)); 159 for (i=0; i<2000; i++) y[i] = x[z[i]]; 160 CHKERRQ(PetscTime(&t2)); 161 fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0); 162 163 /* CHKERRQ(BlastCache()); */ 164 165 CHKERRQ(PetscTime(&t1)); 166 for (i=0; i<2000; i++) x[z[i]] = y[i]; 167 CHKERRQ(PetscTime(&t2)); 168 fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0); 169 170 /* CHKERRQ(BlastCache()); */ 171 172 CHKERRQ(PetscTime(&t1)); 173 for (i=0; i<2000; i++) y[z[i]] = x[zi[i]]; 174 CHKERRQ(PetscTime(&t2)); 175 fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0); 176 177 CHKERRQ(PetscRandomDestroy(&r)); 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 CHKERRQ(PetscMalloc1(5*n,&x)); 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 CHKERRQ(PetscFree(x)); 204 PetscFunctionReturn(0); 205 } 206