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