source: Sophya/trunk/Eval/Speed/vectorC.c@ 1093

Last change on this file since 1093 was 991, checked in by ansari, 25 years ago

Creation du module Eval/Speed - Chronometrage de temps CPU pour le
calcul floattant C/C++/Fortran ... Reza 2/5/2000

File size: 7.9 KB
RevLine 
[991]1#include <stdlib.h>
2#include <stdio.h>
3
4enum _VecTyp { INT, FLOAT, DOUBLE };
5typedef enum _VecTyp VecTyp;
6
7struct _vector
8{
9VecTyp vtyp;
10int size;
11union
12 {
13 int *vi;
14 float *vf;
15 double *vd;
16 } tab;
17};
18typedef struct _vector Vector;
19
20Vector * NewVector(VecTyp typ, int sz, int fg);
21void DeleteVector(Vector *v);
22Vector * AddVector(Vector *v1, Vector *v2, Vector *v3);
23Vector * MultVector(Vector *v1, Vector *v2, Vector *v3);
24
25void InitTim();
26void PrtTim(char *Comm);
27
28Vector * NewVector(VecTyp typ, int sz, int fg)
29{
30Vector *vec;
31int i;
32int * ip;
33float * fp;
34double * dp;
35
36if (sz < 1) return(NULL);
37vec = (Vector *)malloc(sizeof(Vector));
38switch (typ)
39 {
40 case INT :
41 vec->tab.vi = (int *)malloc(sizeof(int)*sz);
42 ip = vec->tab.vi;
43 if (fg) for(i=0; i<sz; i++) ip[i] = 0;
44 break;
45 case FLOAT :
46 vec->tab.vf = (float *)malloc(sizeof(float)*sz);
47 fp = vec->tab.vf;
48 if (fg) for(i=0; i<sz; i++) fp[i] = 0.;
49 break;
50 case DOUBLE :
51 vec->tab.vd = (double *)malloc(sizeof(double)*sz);
52 dp = vec->tab.vd;
53 if (fg) for(i=0; i<sz; i++) dp[i] = 0.;
54 break;
55 default :
56 puts(" Type inconnu ! ");
57 free(vec);
58 return(NULL);
59 break;
60 }
61if (vec->tab.vi == NULL) { free(vec); return(NULL); }
62vec->size = sz;
63vec->vtyp = typ;
64return(vec);
65}
66
67void DeleteVector(Vector *v)
68{
69switch (v->vtyp)
70 {
71 case INT :
72 free(v->tab.vi);
73 break;
74 case FLOAT :
75 free(v->tab.vf);
76 break;
77 case DOUBLE :
78 free(v->tab.vd);
79 break;
80 }
81free(v);
82}
83
84Vector * AddVector(Vector *v1, Vector *v2, Vector *v3)
85{
86register int i;
87register int *ip1,*ip2,*ip3;
88register float *fp1, *fp2, *fp3;
89register double *dp1, *dp2, *dp3;
90
91switch (v3->vtyp)
92 {
93 case INT :
94 ip1 = v1->tab.vi;
95 ip2 = v2->tab.vi;
96 ip3 = v3->tab.vi;
97 for (i=0; i<v3->size; i++) ip3[i] = ip1[i] + ip2[i];
98 break;
99 case FLOAT :
100 fp1 = v1->tab.vf;
101 fp2 = v2->tab.vf;
102 fp3 = v3->tab.vf;
103 for (i=0; i<v3->size; i++) fp3[i] = fp1[i] + fp2[i];
104 break;
105 case DOUBLE :
106 dp1 = v1->tab.vd;
107 dp2 = v2->tab.vd;
108 dp3 = v3->tab.vd;
109 for (i=0; i<v3->size; i++) dp3[i] = dp1[i] + dp2[i];
110 break;
111 default :
112 puts(" Type inconnu ! ");
113 return(NULL);
114 break;
115 }
116return(v3);
117}
118
119Vector * MultVector(Vector *v1, Vector *v2, Vector *v3)
120{
121register int i;
122register int *ip1,*ip2,*ip3;
123register float *fp1, *fp2, *fp3;
124register double *dp1, *dp2, *dp3;
125
126switch (v3->vtyp)
127 {
128 case INT :
129 ip1 = v1->tab.vi;
130 ip2 = v2->tab.vi;
131 ip3 = v3->tab.vi;
132 for (i=0; i<v3->size; i++) ip3[i] = ip1[i] * ip2[i];
133 break;
134 case FLOAT :
135 fp1 = v1->tab.vf;
136 fp2 = v2->tab.vf;
137 fp3 = v3->tab.vf;
138 for (i=0; i<v3->size; i++) fp3[i] = fp1[i] * fp2[i];
139 break;
140 case DOUBLE :
141 dp1 = v1->tab.vd;
142 dp2 = v2->tab.vd;
143 dp3 = v3->tab.vd;
144 for (i=0; i<v3->size; i++) dp3[i] = dp1[i] * dp2[i];
145 break;
146 default :
147 puts(" Type inconnu ! ");
148 return(NULL);
149 break;
150 }
151return(v3);
152}
153
154
155/* --------------------------------------------------------------------- */
156/* --------------------------- Main Program ---------------------------- */
157/* --------------------------------------------------------------------- */
158
159int main (int narg, char *arg[])
160{
161int i,j, N, M, OPT, OPE, fg;
162Vector *iv1, *iv2, *iv3;
163Vector *fv1, *fv2, *fv3;
164Vector *dv1, *dv2, *dv3;
165
166if (narg < 2) {
167 printf("\n Usage: vectorC Type(=1,2,3 Int,Float,Double) Ope(=1/2/3/4) [N [M] ] \n");
168 printf("Ope: 1=Create/Delete 2=1+FillVect 3=Add 4=Mult \n");
169 printf("N: Number of operations (def= 100) \n");
170 printf("M: Vector size (def= 50000) \n\n");
171 exit(0);
172}
173
174 InitTim();
175
176OPT = 1; OPE = 1; fg = 0;
177if (narg > 1) OPT = atoi(arg[1]);
178if ( (OPT < 1) || (OPT > 3) ) OPT = 1;
179
180if (narg > 2) OPE = atoi(arg[2]);
181if ( (OPE < 1) || (OPE > 4) ) OPE = 1;
182
183N = 100;if (narg > 3) N = atoi(arg[3]);
184if (N < 1) N = 1;
185if (N > 100000) N = 100000;
186M = 50000;
187if (narg > 4) M = atoi(arg[4]);
188if (M < 1000) M = 1000;
189if (M > 1000000) M = 1000000;
190
191printf(" VectorC TestSpeed Typ=%d Ope=%d N=%d VSz=%d\n", OPT, OPE, N,M);
192
193if (OPE < 3) { /* Test creation / destruction */
194fg = OPE-1;
195printf("\n\n Test New/DeleteVec - fg= %d ( <> 0 ---> FillVec) \n", fg);
196 switch (OPT)
197 {
198 case 1 :
199 printf("Test %d NewVector/DeleteVector VecINT[%d] \n",N,M);
200 for(i=0; i<N; i++) {
201 iv1 = NewVector(INT, M, fg);
202 DeleteVector(iv1);
203 }
204 break;
205 case 2 :
206 printf("Test %d NewVector/DeleteVector VecFLOAT[%d] \n",N,M);
207 for(i=0; i<N; i++) {
208 fv1 = NewVector(FLOAT, M, fg);
209 DeleteVector(fv1);
210 }
211 break;
212 case 3 :
213 printf("Test %d NewVector/DeleteVector VecDOUBLE[%d] \n",N,M);
214 for(i=0; i<N; i++) {
215 dv1 = NewVector(DOUBLE, M, fg);
216 DeleteVector(dv1);
217 }
218 break;
219 }
220 PrtTim("Fin New/Delete ");
221 printf("Fin de Vector/C \n");
222 return (0);
223}
224
225/* ---------- Test Addition, Multiplication ------------- */
226switch (OPT)
227 {
228 case 1 :
229 printf("\n\n Test %d operations VecINT[%d] \n",N,M);
230 iv1 = NewVector(INT, M, fg);
231 iv2 = NewVector(INT, M, fg);
232 iv3 = NewVector(INT, M, fg);
233
234 PrtTim("Fin_Creation ");
235 for(i=0; i<M; i++)
236 {
237 iv1->tab.vi[i] = random()%1000;
238 iv2->tab.vi[i]= random()%5000; }
239
240 PrtTim("Fin remplissage ");
241 if (OPE == 3) {
242 for(i=0; i<N; i++)
243 AddVector(iv1, iv2, iv3);
244 PrtTim("Fin Addition ");
245 }
246 else {
247 for(i=0; i<N; i++)
248 MultVector(iv1, iv2, iv3);
249 PrtTim("Fin Multiplication ");
250 }
251
252 printf("Result[1.2] I1= %d %d I2= %d %d I3= %d %d \n",
253 iv1->tab.vi[1], iv1->tab.vi[2], iv2->tab.vi[1], iv2->tab.vi[2],
254 iv3->tab.vi[1], iv3->tab.vi[2]);
255
256 printf("Result[991-2] I1= %d %d I2= %d %d I3= %d %d \n",
257 iv1->tab.vi[991], iv1->tab.vi[992], iv2->tab.vi[991], iv2->tab.vi[992],
258 iv3->tab.vi[991], iv3->tab.vi[992]);
259 break;
260
261 case 2 :
262 printf("\n\n Test %d operations VecFLOAT[%d] \n",N,M);
263 InitTim();
264
265 fv1 = NewVector(FLOAT, M, fg);
266 fv2 = NewVector(FLOAT, M, fg);
267 fv3 = NewVector(FLOAT, M, fg);
268
269 PrtTim("Fin_Creation ");
270 for(i=0; i<M; i++)
271 {
272 fv1->tab.vf[i] = (float)(random()%1000)/250.;
273 fv2->tab.vf[i]= (float)(random()%5000)/250.; }
274
275 PrtTim("Fin remplissage ");
276 if (OPE == 3) {
277 for(i=0; i<N; i++)
278 AddVector(fv1, fv2, fv3);
279 PrtTim("Fin Addition ");
280 }
281 else {
282 for(i=0; i<N; i++)
283 MultVector(fv1, fv2, fv3);
284 PrtTim("Fin Multiplication ");
285 }
286 printf("Result[1.2] F1= %g %g F2= %g %g F3= %g %g \n",
287 fv1->tab.vf[1], fv1->tab.vf[2], fv2->tab.vf[1], fv2->tab.vf[2],
288 fv3->tab.vf[1], fv3->tab.vf[2]);
289
290 printf("Result[991-2] F1= %g %g F2= %g %g F3= %g %g \n",
291 fv1->tab.vf[991], fv1->tab.vf[992], fv2->tab.vf[991], fv2->tab.vf[992],
292 fv3->tab.vf[991], fv3->tab.vf[992]);
293 break;
294
295
296 case 3 :
297 printf("\n\n Test %d operations VecDOUBLE[%d] \n",N,M);
298 InitTim();
299
300 dv1 = NewVector(DOUBLE, M, fg);
301 dv2 = NewVector(DOUBLE, M, fg);
302 dv3 = NewVector(DOUBLE, M, fg);
303
304 PrtTim("Fin_Creation ");
305 for(i=0; i<M; i++)
306 {
307 dv1->tab.vd[i] = (double)(random()%1000)/250.;
308 dv2->tab.vd[i]= (double)(random()%5000)/250.; }
309
310 PrtTim("Fin remplissage ");
311 if (OPE == 3) {
312 for(i=0; i<N; i++)
313 AddVector(dv1, dv2, dv3);
314 PrtTim("Fin Addition ");
315 }
316 else {
317 for(i=0; i<N; i++)
318 MultVector(dv1, dv2, dv3);
319 PrtTim("Fin Multiplication ");
320 }
321
322 printf("Result[1.2] D1= %g %g D2= %g %g D3= %g %g \n",
323 dv1->tab.vd[1], dv1->tab.vd[2], dv2->tab.vd[1], dv2->tab.vd[2],
324 dv3->tab.vd[1], dv3->tab.vd[2]);
325
326 printf("Result[991-2] D1= %g %g D2= %g %g D3= %g %g \n",
327 dv1->tab.vd[991], dv1->tab.vd[992], dv2->tab.vd[991], dv2->tab.vd[992],
328 dv3->tab.vd[991], dv3->tab.vd[992]);
329 break;
330
331 default:
332 puts("Erreur d'option !");
333 break;
334 }
335
336
337PrtTim("Fin de Vector/C ");
338return (0);
339}
340
Note: See TracBrowser for help on using the repository browser.