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