Actual source code: Index.c
petsc-3.7.3 2016-08-01
2: #include <petscsys.h>
3: #include <petsctime.h>
6: extern int BlastCache(void);
7: extern int test1(void);
8: extern int test2(void);
12: int main(int argc,char **argv)
13: {
16: PetscInitialize(&argc,&argv,0,0);
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,&r);
36: PetscRandomSetFromOptions(r);
37: PetscMalloc1(20000,&x);
38: PetscMalloc1(20000,&y);
40: PetscMalloc1(2000,&z);
41: PetscMalloc1(2000,&zi);
45: /* Take care of paging effects */
46: PetscTime(&t1);
48: /* Form the random set of integers */
49: for (i=0; i<2000; i++) {
50: PetscRandomGetValue(r,&value);
51: intval = (int)(value*20000.0);
52: z[i] = intval;
53: }
55: for (i=0; i<2000; i++) {
56: PetscRandomGetValue(r,&value);
57: intval = (int)(value*20000.0);
58: zi[i] = intval;
59: }
60: /* fprintf(stdout,"Done setup\n"); */
62: BlastCache();
64: PetscTime(&t1);
65: for (i=0; i<2000; i++) x[i] = y[i];
66: PetscTime(&t2);
67: fprintf(stdout,"%-27s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0);
69: BlastCache();
71: PetscTime(&t1);
72: for (i=0; i<500; i+=4) {
73: x[i] = y[z[i]];
74: x[1+i] = y[z[1+i]];
75: x[2+i] = y[z[2+i]];
76: x[3+i] = y[z[3+i]];
77: }
78: PetscTime(&t2);
79: fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]] - unroll 4",(t2-t1)/2000.0);
81: BlastCache();
83: PetscTime(&t1);
84: for (i=0; i<2000; i++) x[i] = y[z[i]];
85: PetscTime(&t2);
86: fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0);
88: BlastCache();
90: PetscTime(&t1);
91: for (i=0; i<1000; i+=2) { x[i] = y[z[i]]; x[1+i] = y[z[1+i]]; }
92: PetscTime(&t2);
93: fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]] - unroll 2",(t2-t1)/2000.0);
95: BlastCache();
97: PetscTime(&t1);
98: for (i=0; i<2000; i++) x[z[i]] = y[i];
99: PetscTime(&t2);
100: fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0);
102: BlastCache();
104: PetscTime(&t1);
105: for (i=0; i<2000; i++) x[z[i]] = y[zi[i]];
106: PetscTime(&t2);
107: fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0);
109: PetscMemcpy(x,y,10);
110: PetscMemcpy(z,zi,10);
111: PetscFree(z);
112: PetscFree(zi);
113: PetscFree(x);
114: PetscFree(y);
115: PetscRandomDestroy(&r);
116: return(0);
117: }
121: int test2(void)
122: {
123: PetscLogDouble t1,t2;
124: double value;
125: int i,ierr,z[20000],zi[20000],intval,tmp;
126: PetscScalar x[20000],y[20000];
127: PetscRandom r;
129: PetscRandomCreate(PETSC_COMM_SELF,&r);
130: PetscRandomSetFromOptions(r);
132: /* Take care of paging effects */
133: PetscTime(&t1);
135: for (i=0; i<20000; i++) {
136: x[i] = i;
137: y[i] = i;
138: z[i] = i;
139: zi[i] = i;
140: }
142: /* Form the random set of integers */
143: for (i=0; i<20000; i++) {
144: PetscRandomGetValue(r,&value);
145: intval = (int)(value*20000.0);
146: tmp = z[i];
147: z[i] = z[intval];
148: z[intval] = tmp;
149: }
151: for (i=0; i<20000; i++) {
152: PetscRandomGetValue(r,&value);
153: intval = (int)(value*20000.0);
154: tmp = zi[i];
155: zi[i] = zi[intval];
156: zi[intval] = tmp;
157: }
158: /* fprintf(stdout,"Done setup\n"); */
160: /* BlastCache(); */
162: PetscTime(&t1);
163: for (i=0; i<2000; i++) x[i] = y[i];
164: PetscTime(&t2);
165: fprintf(stdout,"%-27s : %e sec\n","x[i] = y[i]",(t2-t1)/2000.0);
167: /* BlastCache(); */
169: PetscTime(&t1);
170: for (i=0; i<2000; i++) y[i] = x[z[i]];
171: PetscTime(&t2);
172: fprintf(stdout,"%-27s : %e sec\n","x[i] = y[idx[i]]",(t2-t1)/2000.0);
174: /* BlastCache(); */
176: PetscTime(&t1);
177: for (i=0; i<2000; i++) x[z[i]] = y[i];
178: PetscTime(&t2);
179: fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[i]",(t2-t1)/2000.0);
181: /* BlastCache(); */
183: PetscTime(&t1);
184: for (i=0; i<2000; i++) y[z[i]] = x[zi[i]];
185: PetscTime(&t2);
186: fprintf(stdout,"%-27s : %e sec\n","x[z[i]] = y[zi[i]]",(t2-t1)/2000.0);
189: PetscRandomDestroy(&r);
190: return(0);
191: }
195: int BlastCache(void)
196: {
197: int i,ierr,n = 1000000;
198: PetscScalar *x,*y,*z,*a,*b;
200: PetscMalloc1(5*n,&x);
201: y = x + n;
202: z = y + n;
203: a = z + n;
204: b = a + n;
206: for (i=0; i<n; i++) {
207: a[i] = (PetscScalar) i;
208: y[i] = (PetscScalar) i;
209: z[i] = (PetscScalar) i;
210: b[i] = (PetscScalar) i;
211: x[i] = (PetscScalar) i;
212: }
214: for (i=0; i<n; i++) a[i] = 3.0*x[i] + 2.0*y[i] + 3.3*z[i] - 25.*b[i];
215: for (i=0; i<n; i++) b[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i];
216: for (i=0; i<n; i++) z[i] = 3.0*x[i] + 2.0*y[i] + 3.3*a[i] - 25.*b[i];
217: PetscFree(x);
218: return(0);
219: }