Actual source code: Index.c
petsc-3.3-p7 2013-05-11
2: #include <petscsys.h>
4: extern int BlastCache(void);
5: extern int test1(void);
6: extern int test2(void);
7:
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: }
25: int test1(void)
26: {
27: PetscLogDouble t1,t2;
28: double value;
29: int i,ierr,*z,*zi,intval;
30: PetscScalar *x,*y;
31: PetscRandom r;
33: PetscRandomCreate(PETSC_COMM_SELF,&r);
34: PetscRandomSetFromOptions(r);
35: PetscMalloc(20000*sizeof(PetscScalar),&x);
36: PetscMalloc(20000*sizeof(PetscScalar),&y);
38: PetscMalloc(2000*sizeof(int),&z);
39: PetscMalloc(2000*sizeof(int),&zi);
43: /* Take care of paging effects */
44: PetscGetTime(&t1);
45:
46: /* Form the random set of integers */
47: for (i=0; i<2000; i++) {
48: PetscRandomGetValue(r,&value);
49: intval = (int)(value*20000.0);
50: z[i] = intval;
51: }
53: for (i=0; i<2000; i++) {
54: PetscRandomGetValue(r,&value);
55: intval = (int)(value*20000.0);
56: zi[i] = intval;
57: }
58: /* fprintf(stdout,"Done setup\n"); */
60: BlastCache();
62: PetscGetTime(&t1);
63: for (i=0; i<2000; i++) { x[i] = y[i]; }
64: PetscGetTime(&t2);
65: fprintf(stdout,"%-27s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0);
67: BlastCache();
69: PetscGetTime(&t1);
70: for (i=0; i<500; i+=4) {
71: x[i] = y[z[i]];
72: x[1+i] = y[z[1+i]];
73: x[2+i] = y[z[2+i]];
74: x[3+i] = y[z[3+i]];
75: }
76: PetscGetTime(&t2);
77: fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]] - unroll 4",(t2-t1)/2000.0);
79: BlastCache();
81: PetscGetTime(&t1);CHKERRQ(ierr)
82: for (i=0; i<2000; i++) { x[i] = y[z[i]]; }
83: PetscGetTime(&t2);
84: fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0);
86: BlastCache();
88: PetscGetTime(&t1);
89: for (i=0; i<1000; i+=2) { x[i] = y[z[i]]; x[1+i] = y[z[1+i]]; }
90: PetscGetTime(&t2);
91: fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]] - unroll 2",(t2-t1)/2000.0);
93: BlastCache();
95: PetscGetTime(&t1);
96: for (i=0; i<2000; i++) { x[z[i]] = y[i]; }
97: PetscGetTime(&t2);
98: fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0);
100: BlastCache();
102: PetscGetTime(&t1);
103: for (i=0; i<2000; i++) { x[z[i]] = y[zi[i]]; }
104: PetscGetTime(&t2);
105: fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0);
106:
107: PetscMemcpy(x,y,10);
108: PetscMemcpy(z,zi,10);
109: PetscFree(z);
110: PetscFree(zi);
111: PetscFree(x);
112: PetscFree(y);
113: PetscRandomDestroy(&r);
114: return(0);
115: }
119: int test2(void)
120: {
121: PetscLogDouble t1,t2;
122: double value;
123: int i,ierr,z[20000],zi[20000],intval,tmp;
124: PetscScalar x[20000],y[20000];
125: PetscRandom r;
127: PetscRandomCreate(PETSC_COMM_SELF,&r);
128: PetscRandomSetFromOptions(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: }