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