Actual source code: Index.c

  1: /*$Id: Index.c,v 1.35 2001/08/29 20:59:23 balay Exp $*/

 3:  #include petsc.h
 4:  #include petscsys.h

  6: extern int BlastCache(void);
  7: extern int test1(void);
  8: extern int test2(void);
  9: 
 10: int main(int argc,char **argv)
 11: {

 14:   PetscInitialize(&argc,&argv,0,0);
 15: 
 16:   test1();
 17:   test2();

 19:   PetscFinalize();
 20:   return(0);
 21: }

 23: int test1(void)
 24: {
 25:   PetscLogDouble  t1,t2;
 26:   double      value;
 27:   int         i,ierr,*z,*zi,intval;
 28:   PetscScalar *x,*y;
 29:   PetscRandom r;

 31:   PetscRandomCreate(PETSC_COMM_SELF,RANDOM_DEFAULT,&r);
 32:   PetscMalloc(20000*sizeof(PetscScalar),&x);
 33:   PetscMalloc(20000*sizeof(PetscScalar),&y);

 35:   PetscMalloc(2000*sizeof(int),&z);
 36:   PetscMalloc(2000*sizeof(int),&zi);



 40:   /* Take care of paging effects */
 41:   PetscGetTime(&t1);
 42: 
 43:    /* Form the random set of integers */
 44:   for (i=0; i<2000; i++) {
 45:     ierr   = PetscRandomGetValue(r,&value);
 46:     intval = (int)(value*20000.0);
 47:     z[i]   = intval;
 48:   }

 50:   for (i=0; i<2000; i++) {
 51:     ierr    = PetscRandomGetValue(r,&value);
 52:     intval  = (int)(value*20000.0);
 53:     zi[i]   = intval;
 54:   }
 55:   /* fprintf(stdout,"Done setupn"); */

 57:   BlastCache();

 59:   PetscGetTime(&t1);
 60:   for (i=0; i<2000; i++) {  x[i] = y[i]; }
 61:   PetscGetTime(&t2);
 62:   fprintf(stdout,"%-27s : %e secn","x[i] = y[i]",(t2-t1)/2000.0);

 64:   BlastCache();

 66:   PetscGetTime(&t1);
 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:   PetscGetTime(&t2);
 74:   fprintf(stdout,"%-27s : %e secn","x[i] = y[idx[i]] - unroll 4",(t2-t1)/2000.0);

 76:   BlastCache();

 78:   PetscGetTime(&t1);CHKERRQ(ierr)
 79:   for (i=0; i<2000; i++) {  x[i] = y[z[i]]; }
 80:   PetscGetTime(&t2);
 81:   fprintf(stdout,"%-27s : %e secn","x[i] = y[idx[i]]",(t2-t1)/2000.0);

 83:   BlastCache();

 85:   PetscGetTime(&t1);
 86:   for (i=0; i<1000; i+=2) {  x[i] = y[z[i]];  x[1+i] = y[z[1+i]]; }
 87:   PetscGetTime(&t2);
 88:   fprintf(stdout,"%-27s : %e secn","x[i] = y[idx[i]] - unroll 2",(t2-t1)/2000.0);

 90:   BlastCache();

 92:   PetscGetTime(&t1);
 93:   for (i=0; i<2000; i++) {  x[z[i]] = y[i]; }
 94:   PetscGetTime(&t2);
 95:   fprintf(stdout,"%-27s : %e secn","x[z[i]] = y[i]",(t2-t1)/2000.0);

 97:   BlastCache();

 99:   PetscGetTime(&t1);
100:   for (i=0; i<2000; i++) {  x[z[i]] = y[zi[i]]; }
101:   PetscGetTime(&t2);
102:   fprintf(stdout,"%-27s : %e secn","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: }

114: int test2(void)
115: {
116:   PetscLogDouble   t1,t2;
117:   double       value;
118:   int          i,ierr,z[20000],zi[20000],intval,tmp;
119:   PetscScalar  x[20000],y[20000];
120:   PetscRandom  r;

122:   PetscRandomCreate(PETSC_COMM_SELF,RANDOM_DEFAULT,&r);

124:   /* Take care of paging effects */
125:   PetscGetTime(&t1);
126: 
127:   for (i=0; i<20000; i++) {
128:     x[i]  = i;
129:     y[i]  = i;
130:     z[i]  = i;
131:     zi[i] = i;
132:   }

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

143:   for (i=0; i<20000; i++) {
144:     ierr   = PetscRandomGetValue(r,&value);
145:     intval = (int)(value*20000.0);
146:     tmp    = zi[i];
147:     zi[i]  = zi[intval];
148:     zi[intval] = tmp;
149:   }
150:   /* fprintf(stdout,"Done setupn"); */

152:   /* BlastCache(); */

154:   PetscGetTime(&t1);
155:   for (i=0; i<2000; i++) {  x[i] = y[i]; }
156:   PetscGetTime(&t2);
157:   fprintf(stdout,"%-27s : %e secn","x[i] = y[i]",(t2-t1)/2000.0);

159:   /* BlastCache(); */

161:   PetscGetTime(&t1);
162:   for (i=0; i<2000; i++) {  y[i] = x[z[i]]; }
163:   PetscGetTime(&t2);
164:   fprintf(stdout,"%-27s : %e secn","x[i] = y[idx[i]]",(t2-t1)/2000.0);

166:   /* BlastCache(); */

168:   PetscGetTime(&t1);
169:   for (i=0; i<2000; i++) {  x[z[i]] = y[i]; }
170:   PetscGetTime(&t2);
171:   fprintf(stdout,"%-27s : %e secn","x[z[i]] = y[i]",(t2-t1)/2000.0);

173:   /* BlastCache(); */

175:   PetscGetTime(&t1);
176:   for (i=0; i<2000; i++) {  y[z[i]] = x[zi[i]]; }
177:   PetscGetTime(&t2);
178:   fprintf(stdout,"%-27s : %e secn","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0);


181:   PetscRandomDestroy(r);
182:   return(0);
183: }

185: int BlastCache(void)
186: {
187:   int    i,ierr,n = 1000000;
188:   PetscScalar *x,*y,*z,*a,*b;

190:   PetscMalloc(5*n*sizeof(PetscScalar),&x);
191:   y = x + n;
192:   z = y + n;
193:   a = z + n;
194:   b = a + n;

196:   for (i=0; i<n; i++) {
197:     a[i] = (PetscScalar) i;
198:     y[i] = (PetscScalar) i;
199:     z[i] = (PetscScalar) i;
200:     b[i] = (PetscScalar) i;
201:     x[i] = (PetscScalar) i;
202:   }

204:   for (i=0; i<n; i++) {
205:     a[i] = 3.0*x[i] + 2.0*y[i] + 3.3*z[i] - 25.*b[i];
206:   }
207:   for (i=0; i<n; i++) {
208:     b[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i];
209:   }
210:   for (i=0; i<n; i++) {
211:     z[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i];
212:   }
213:   PetscFree(x);
214:   return(0);
215: }