Actual source code: Index.c


  2: #include <petscsys.h>
  3: #include <petsctime.h>

  5: extern int BlastCache(void);
  6: extern int test1(void);
  7: extern int test2(void);

  9: int main(int argc,char **argv)
 10: {

 13:   PetscInitialize(&argc,&argv,0,0);if (ierr) return ierr;
 14:   test1();
 15:   test2();
 16:   PetscFinalize();
 17:   return ierr;
 18: }

 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;

 28:   PetscRandomCreate(PETSC_COMM_SELF,&r);
 29:   PetscRandomSetFromOptions(r);
 30:   PetscMalloc1(20000,&x);
 31:   PetscMalloc1(20000,&y);

 33:   PetscMalloc1(2000,&z);
 34:   PetscMalloc1(2000,&zi);

 36:   /* Take care of paging effects */
 37:   PetscTime(&t1);

 39:   /* Form the random set of integers */
 40:   for (i=0; i<2000; i++) {
 41:     PetscRandomGetValue(r,&value);
 42:     intval = (int)(value*20000.0);
 43:     z[i]   = intval;
 44:   }

 46:   for (i=0; i<2000; i++) {
 47:     PetscRandomGetValue(r,&value);
 48:     intval = (int)(value*20000.0);
 49:     zi[i]  = intval;
 50:   }
 51:   /* fprintf(stdout,"Done setup\n"); */

 53:   BlastCache();

 55:   PetscTime(&t1);
 56:   for (i=0; i<2000; i++) x[i] = y[i];
 57:   PetscTime(&t2);
 58:   fprintf(stdout,"%-27s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0);

 60:   BlastCache();

 62:   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:   PetscTime(&t2);
 70:   fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]] - unroll 4",(t2-t1)/2000.0);

 72:   BlastCache();

 74:   PetscTime(&t1);
 75:   for (i=0; i<2000; i++) x[i] = y[z[i]];
 76:   PetscTime(&t2);
 77:   fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0);

 79:   BlastCache();

 81:   PetscTime(&t1);
 82:   for (i=0; i<1000; i+=2) {  x[i] = y[z[i]];  x[1+i] = y[z[1+i]]; }
 83:   PetscTime(&t2);
 84:   fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]] - unroll 2",(t2-t1)/2000.0);

 86:   BlastCache();

 88:   PetscTime(&t1);
 89:   for (i=0; i<2000; i++) x[z[i]] = y[i];
 90:   PetscTime(&t2);
 91:   fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0);

 93:   BlastCache();

 95:   PetscTime(&t1);
 96:   for (i=0; i<2000; i++) x[z[i]] = y[zi[i]];
 97:   PetscTime(&t2);
 98:   fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0);

100:   PetscArraycpy(x,y,10);
101:   PetscArraycpy(z,zi,10);
102:   PetscFree(z);
103:   PetscFree(zi);
104:   PetscFree(x);
105:   PetscFree(y);
106:   PetscRandomDestroy(&r);
107:   return(0);
108: }

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;

118:   PetscRandomCreate(PETSC_COMM_SELF,&r);
119:   PetscRandomSetFromOptions(r);

121:   /* Take care of paging effects */
122:   PetscTime(&t1);

124:   for (i=0; i<20000; i++) {
125:     x[i]  = i;
126:     y[i]  = i;
127:     z[i]  = i;
128:     zi[i] = i;
129:   }

131:   /* Form the random set of integers */
132:   for (i=0; i<20000; i++) {
133:     PetscRandomGetValue(r,&value);
134:     intval    = (int)(value*20000.0);
135:     tmp       = z[i];
136:     z[i]      = z[intval];
137:     z[intval] = tmp;
138:   }

140:   for (i=0; i<20000; i++) {
141:     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"); */

149:   /* BlastCache(); */

151:   PetscTime(&t1);
152:   for (i=0; i<2000; i++) x[i] = y[i];
153:   PetscTime(&t2);
154:   fprintf(stdout,"%-27s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0);

156:   /* BlastCache(); */

158:   PetscTime(&t1);
159:   for (i=0; i<2000; i++) y[i] = x[z[i]];
160:   PetscTime(&t2);
161:   fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0);

163:   /* BlastCache(); */

165:   PetscTime(&t1);
166:   for (i=0; i<2000; i++) x[z[i]] = y[i];
167:   PetscTime(&t2);
168:   fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0);

170:   /* BlastCache(); */

172:   PetscTime(&t1);
173:   for (i=0; i<2000; i++) y[z[i]] = x[zi[i]];
174:   PetscTime(&t2);
175:   fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0);

177:   PetscRandomDestroy(&r);
178:   return(0);
179: }

181: int BlastCache(void)
182: {
183:   int         i,ierr,n = 1000000;
184:   PetscScalar *x,*y,*z,*a,*b;

186:   PetscMalloc1(5*n,&x);
187:   y    = x + n;
188:   z    = y + n;
189:   a    = z + n;
190:   b    = a + n;

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:   }

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:   PetscFree(x);
204:   return(0);
205: }