1 #ifndef lint 2 static char vcid[] = "$Id: Index.c,v 1.14 1997/04/10 00:07:26 bsmith Exp bsmith $"; 3 #endif 4 5 #include "stdio.h" 6 #include "petsc.h" 7 #include "sys.h" 8 9 int BlastCache(); 10 int test1(); 11 int test2(); 12 13 int main( int argc, char **argv) 14 { 15 PetscInitialize(&argc, &argv,0,0); 16 17 test1(); 18 test2(); 19 20 PetscFinalize(); 21 return 0; 22 } 23 24 int test1() 25 { 26 PLogDouble t1, t2; 27 double value; 28 int i, ierr,*z,*zi, intval; 29 Scalar *x, *y; 30 PetscRandom r; 31 32 ierr = PetscRandomCreate(PETSC_COMM_SELF,RANDOM_DEFAULT,&r); CHKERRQ(ierr); 33 x = (Scalar *)PetscMalloc(20000*sizeof(Scalar)); CHKPTRA(x); 34 y = (Scalar *)PetscMalloc(20000*sizeof(Scalar)); CHKPTRA(y); 35 36 z = (int *)PetscMalloc(2000*sizeof(int)); CHKPTRA(z); 37 zi = (int *)PetscMalloc(2000*sizeof(int)); CHKPTRA(zi); 38 39 40 41 /* Take care of paging effects */ 42 t1 = PetscGetTime(); 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(stderr,"Done setup\n"); 57 58 BlastCache(); 59 60 t1 = PetscGetTime(); 61 for (i=0; i<2000; i++) { x[i] = y[i]; } 62 t2 = PetscGetTime(); 63 fprintf(stderr,"%-19s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0); 64 65 BlastCache(); 66 67 t1 = PetscGetTime(); 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 t2 = PetscGetTime(); 75 fprintf(stderr,"%-19s : %e sec\n","x[i] = y[idx[i]] - unroll 4",(t2-t1)/2000.0); 76 77 BlastCache(); 78 79 t1 = PetscGetTime(); 80 for (i=0; i<2000; i++) { x[i] = y[z[i]]; } 81 t2 = PetscGetTime(); 82 fprintf(stderr,"%-19s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0); 83 84 BlastCache(); 85 86 t1 = PetscGetTime(); 87 for (i=0; i<1000; i+=2) { x[i] = y[z[i]]; x[1+i] = y[z[1+i]]; } 88 t2 = PetscGetTime(); 89 fprintf(stderr,"%-19s : %e sec\n","x[i] = y[idx[i]] - unroll 2",(t2-t1)/2000.0); 90 91 BlastCache(); 92 93 t1 = PetscGetTime(); 94 for (i=0; i<2000; i++) { x[z[i]] = y[i]; } 95 t2 = PetscGetTime(); 96 fprintf(stderr,"%-19s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0); 97 98 BlastCache(); 99 100 t1 = PetscGetTime(); 101 for (i=0; i<2000; i++) { x[z[i]] = y[zi[i]]; } 102 t2 = PetscGetTime(); 103 fprintf(stderr,"%-19s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0); 104 105 PetscMemcpy(x,y,10); 106 PetscMemcpy(z,zi,10); 107 PetscFree(z); 108 PetscFree(zi); 109 PetscFree(x); 110 PetscFree(y); 111 PetscRandomDestroy(r); 112 return 0; 113 } 114 115 int test2() 116 { 117 PLogDouble t1, t2; 118 double value; 119 int i, ierr,z[2000],zi[20000], intval, tmp; 120 Scalar x[20000], y[20000]; 121 PetscRandom r; 122 123 ierr = PetscRandomCreate(PETSC_COMM_SELF,RANDOM_DEFAULT,&r); CHKERRQ(ierr); 124 125 /* Take care of paging effects */ 126 t1 = PetscGetTime(); 127 128 for (i=0; i<2000; i++) { 129 zi[i] = i; 130 z[i] = i; 131 } 132 133 for (i=0; i<20000; i++) { 134 x[i] = i; 135 y[i] = i; 136 } 137 138 /* Form the random set of integers */ 139 for (i=0; i<2000; 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<2000; 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(stderr,"Done setup\n"); 155 156 /* BlastCache(); */ 157 158 t1 = PetscGetTime(); 159 for (i=0; i<2000; i++) { x[i] = y[i]; } 160 t2 = PetscGetTime(); 161 fprintf(stderr,"%-19s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0); 162 163 /* BlastCache(); */ 164 165 t1 = PetscGetTime(); 166 for (i=0; i<2000; i++) { y[i] = x[z[i]]; } 167 t2 = PetscGetTime(); 168 fprintf(stderr,"%-19s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0); 169 170 /* BlastCache(); */ 171 172 t1 = PetscGetTime(); 173 for (i=0; i<2000; i++) { x[z[i]] = y[i]; } 174 t2 = PetscGetTime(); 175 fprintf(stderr,"%-19s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0); 176 177 /* BlastCache(); */ 178 179 t1 = PetscGetTime(); 180 for (i=0; i<2000; i++) { y[z[i]] = x[zi[i]]; } 181 t2 = PetscGetTime(); 182 fprintf(stderr,"%-19s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0); 183 184 185 PetscRandomDestroy(r); 186 return 0; 187 } 188 189 int BlastCache() 190 { 191 int i,n = 1000000; 192 Scalar *x,*y,*z,*a, *b; 193 194 x = (Scalar *) PetscMalloc(5*n*sizeof(Scalar)); CHKPTRA(x); 195 y = x + n; 196 z = y + n; 197 a = z + n; 198 b = a + n; 199 200 for ( i=0; i<n; i++ ) { 201 a[i] = (Scalar) i; 202 y[i] = (Scalar) i; 203 z[i] = (Scalar) i; 204 b[i] = (Scalar) i; 205 x[i] = (Scalar) i; 206 } 207 208 for ( i=0; i<n; i++ ) { 209 a[i] = 3.0*x[i] + 2.0*y[i] + 3.3*z[i] - 25.*b[i]; 210 } 211 for ( i=0; i<n; i++ ) { 212 b[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i]; 213 } 214 for ( i=0; i<n; i++ ) { 215 z[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i]; 216 } 217 PetscFree(x); 218 return 0; 219 } 220