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:
12: int main(int argc,char **argv)
13: {
16: PetscInitialize(&argc,&argv,0,0);
17:
18: test1();
19: test2();
21: PetscFinalize();
22: return(0);
23: }
27: int test1(void)
28: {
29: PetscLogDouble t1,t2;
30: double value;
31: int i,ierr,*z,*zi,intval;
32: PetscScalar *x,*y;
33: PetscRandom r;
35: PetscRandomCreate(PETSC_COMM_SELF,RANDOM_DEFAULT,&r);
36: PetscMalloc(20000*sizeof(PetscScalar),&x);
37: PetscMalloc(20000*sizeof(PetscScalar),&y);
39: PetscMalloc(2000*sizeof(int),&z);
40: PetscMalloc(2000*sizeof(int),&zi);
44: /* Take care of paging effects */
45: PetscGetTime(&t1);
46:
47: /* Form the random set of integers */
48: for (i=0; i<2000; i++) {
49: PetscRandomGetValue(r,&value);
50: intval = (int)(value*20000.0);
51: z[i] = intval;
52: }
54: for (i=0; i<2000; i++) {
55: PetscRandomGetValue(r,&value);
56: intval = (int)(value*20000.0);
57: zi[i] = intval;
58: }
59: /* fprintf(stdout,"Done setup\n"); */
61: BlastCache();
63: PetscGetTime(&t1);
64: for (i=0; i<2000; i++) { x[i] = y[i]; }
65: PetscGetTime(&t2);
66: fprintf(stdout,"%-27s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0);
68: BlastCache();
70: PetscGetTime(&t1);
71: for (i=0; i<500; i+=4) {
72: x[i] = y[z[i]];
73: x[1+i] = y[z[1+i]];
74: x[2+i] = y[z[2+i]];
75: x[3+i] = y[z[3+i]];
76: }
77: PetscGetTime(&t2);
78: fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]] - unroll 4",(t2-t1)/2000.0);
80: BlastCache();
82: PetscGetTime(&t1);CHKERRQ(ierr)
83: for (i=0; i<2000; i++) { x[i] = y[z[i]]; }
84: PetscGetTime(&t2);
85: fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0);
87: BlastCache();
89: PetscGetTime(&t1);
90: for (i=0; i<1000; i+=2) { x[i] = y[z[i]]; x[1+i] = y[z[1+i]]; }
91: PetscGetTime(&t2);
92: fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]] - unroll 2",(t2-t1)/2000.0);
94: BlastCache();
96: PetscGetTime(&t1);
97: for (i=0; i<2000; i++) { x[z[i]] = y[i]; }
98: PetscGetTime(&t2);
99: fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0);
101: BlastCache();
103: PetscGetTime(&t1);
104: for (i=0; i<2000; i++) { x[z[i]] = y[zi[i]]; }
105: PetscGetTime(&t2);
106: fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0);
107:
108: PetscMemcpy(x,y,10);
109: PetscMemcpy(z,zi,10);
110: PetscFree(z);
111: PetscFree(zi);
112: PetscFree(x);
113: PetscFree(y);
114: PetscRandomDestroy(r);
115: return(0);
116: }
120: int test2(void)
121: {
122: PetscLogDouble t1,t2;
123: double value;
124: int i,ierr,z[20000],zi[20000],intval,tmp;
125: PetscScalar x[20000],y[20000];
126: PetscRandom r;
128: PetscRandomCreate(PETSC_COMM_SELF,RANDOM_DEFAULT,&r);
130: /* Take care of paging effects */
131: PetscGetTime(&t1);
132:
133: for (i=0; i<20000; i++) {
134: x[i] = i;
135: y[i] = i;
136: z[i] = i;
137: zi[i] = i;
138: }
140: /* Form the random set of integers */
141: for (i=0; i<20000; i++) {
142: PetscRandomGetValue(r,&value);
143: intval = (int)(value*20000.0);
144: tmp = z[i];
145: z[i] = z[intval];
146: z[intval] = tmp;
147: }
149: for (i=0; i<20000; i++) {
150: PetscRandomGetValue(r,&value);
151: intval = (int)(value*20000.0);
152: tmp = zi[i];
153: zi[i] = zi[intval];
154: zi[intval] = tmp;
155: }
156: /* fprintf(stdout,"Done setup\n"); */
158: /* BlastCache(); */
160: PetscGetTime(&t1);
161: for (i=0; i<2000; i++) { x[i] = y[i]; }
162: PetscGetTime(&t2);
163: fprintf(stdout,"%-27s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0);
165: /* BlastCache(); */
167: PetscGetTime(&t1);
168: for (i=0; i<2000; i++) { y[i] = x[z[i]]; }
169: PetscGetTime(&t2);
170: fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0);
172: /* BlastCache(); */
174: PetscGetTime(&t1);
175: for (i=0; i<2000; i++) { x[z[i]] = y[i]; }
176: PetscGetTime(&t2);
177: fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0);
179: /* BlastCache(); */
181: PetscGetTime(&t1);
182: for (i=0; i<2000; i++) { y[z[i]] = x[zi[i]]; }
183: PetscGetTime(&t2);
184: fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0);
187: PetscRandomDestroy(r);
188: return(0);
189: }
193: int BlastCache(void)
194: {
195: int i,ierr,n = 1000000;
196: PetscScalar *x,*y,*z,*a,*b;
198: PetscMalloc(5*n*sizeof(PetscScalar),&x);
199: y = x + n;
200: z = y + n;
201: a = z + n;
202: b = a + n;
204: for (i=0; i<n; i++) {
205: a[i] = (PetscScalar) i;
206: y[i] = (PetscScalar) i;
207: z[i] = (PetscScalar) i;
208: b[i] = (PetscScalar) i;
209: x[i] = (PetscScalar) i;
210: }
212: for (i=0; i<n; i++) {
213: a[i] = 3.0*x[i] + 2.0*y[i] + 3.3*z[i] - 25.*b[i];
214: }
215: for (i=0; i<n; i++) {
216: b[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i];
217: }
218: for (i=0; i<n; i++) {
219: z[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i];
220: }
221: PetscFree(x);
222: return(0);
223: }