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