source: Sophya/trunk/SophyaProg/Tests/spar.cc@ 4057

Last change on this file since 4057 was 2940, checked in by ansari, 19 years ago

Ajout test 6.b (ope. && MultElt) ds spar.cc (speed TArray) - Reza 24/04/2006

File size: 5.6 KB
RevLine 
[2615]1#include "sopnamsp.h"
[2586]2#include "machdefs.h"
3
4#include <math.h>
5#include <iostream>
6
7#include "tarrinit.h"
8#include "array.h"
9#include "timing.h"
10#include "resusage.h"
11
12/* Programme de test de vitesse des operations sur TArray */
13/* de SOPHYA Reza, Juillet 2004 */
14
15/* Flag a activer pour compiler avec SOPHYA V <= 1.7 */
16/* #define VSOP_17 */
17
18int main(int narg, char* arg[])
19{
20
21 SophyaInit();
22 InitTim(); // Initializing the CPU timer
23
24 if (narg < 5) {
25 cout << " spar TSel NLoop NRow NCols \n"
26 << " TSel=0/1/2: Option de selection test 7 avec sous-tableaux \n"
27 << " 0: Ne pas faire test 7 (couteux en V <= 1.7) \n"
28 << " 1: Test 7 1ere partie (sans AA.Row(r)*x+BB.Row(r)*y \n"
29 << " 2: Test 7 complet \n"
30 << " NLoop: Nombre d'iterations \n"
31 << " NRow,NCols: Taille de matrices \n"
32 << " Exemple: spar 0 10 800 1000 (Grande taille memoire) \n"
33 << " spar 1 100 80 100 (Petite taille memoire) \n" << endl;
34 return 1;
35 }
36 int ope = atoi(arg[1]);
37 int nloop = atoi(arg[2]);
38 int nr = atoi(arg[3]);
39 int nc = atoi(arg[4]);
40
41 cout << " ------------------------------------------------- " << endl;
42 cout << " spar = SpeedArray Ope=" << ope << " NLoop= " << nloop
43 << " NR= " << nr << " NC= " << nc << endl;
44 cout << " ------------------------------------------------- " << endl;
45
46 ResourceUsage res;
47 cout << "(1) Initialisation matrices Ac,Bc,Af,Bf - Random" << endl;
48 Matrix A(nr, nc, BaseArray::CMemoryMapping);
49 Matrix B(nr, nc, BaseArray::CMemoryMapping);
50 Matrix Ac(nr, nc, BaseArray::CMemoryMapping);
51 Matrix Bc(nr, nc, BaseArray::CMemoryMapping);
52 Matrix Af(nr, nc, BaseArray::FortranMemoryMapping);
53 Matrix Bf(nr, nc, BaseArray::CMemoryMapping);
54
55 A = RandomSequence(RandomSequence::Flat);
56 B = RandomSequence(RandomSequence::Flat);
57
58 Ac = A;
59 Bc = B;
60 Af = A;
61 Bf = B;
62
63 PrtTim("(1) ApresInit Ac,Bc,Af,Bf ");
64 cout << res;
65
66 long nop, noptot;
67 noptot = 0;
68
69 cout << "(2) Operations de type A *= c , A += B " << endl;
70 Ac = A; Bc = B;
71 Af = A; Bf = B;
72 for(int k=0; k<nloop; k++) {
73 Ac *= 1.2;
74 Bf *= 1.15;
75 Ac -= Bc;
76 Af += Bf;
77 }
78 nop = nloop*nr*nc*4/1000;
79 cout << "(2) Op A *= c, A += B (KFLOP) = " << nop << endl;
80 noptot += nop;
81 PrtTim(" Apres (2) ");
82
83 cout << "(3) Operations de type C = A*c , E = A+B " << endl;
84 Ac = A; Bc = B;
85 Af = A; Bf = B;
86 for(int k=0; k<nloop; k++) {
87 Matrix C = Ac*8.5;
88 C = Bf*54.;
89 Matrix E = Ac-Bc;
90 E = Af+Bc;
91 }
92 nop = nloop*nr*nc*4/1000;
93 cout << "(3) Op C = A*c , E = A+B (KFLOP) = " << nop << endl;
94 noptot += nop;
95 PrtTim(" Apres (3) ");
96
97
98 cout << "(4) Operations de type C = A*x+B*y " << endl;
99 Ac = A; Bc = B;
100 Af = A; Bf = B;
101 for(int k=0; k<nloop; k++) {
102 Matrix Ccc = Ac*4.+2.5*Bc;
103 Matrix Ccf = Ac*4.+2.5*Bf;
104 Matrix Cff = Af*4.+2.5*Bc;
105 }
106 nop = nloop*3*nr*nc*3/1000;
107 cout << "(4) Op C = A*x+B*y (KFLOP) = " << nop << endl;
108 noptot += nop;
109 PrtTim(" Apres (4) ");
110
111
112 cout << "(5) Operations de type C = A*x+B*y-z*A-B*t " << endl;
113 Ac = A; Bc = B;
114 Af = A; Bf = B;
115 for(int k=0; k<nloop; k++) {
116 Matrix Ccc = Ac*4.+2.5*Bc-0.3*Ac-Bc*0.8;
117 Matrix Ccf = Ac*4.+2.5*Bf-0.3*Ac-Bf*0.8;
118 Matrix Cff = Af*4.+2.5*Bf-0.3*Af-Bf*0.8;
119 }
120 nop = nloop*3*nr*nc*7/1000;
121 cout << "(5) Op C = A*x+B*y-z*A-B*t (KFLOP) = " << nop << endl;
122 noptot += nop;
123 PrtTim(" Apres (5) ");
124
125 cout << "(6) Operations de type (A*x+y*B).MulElt(B-A, ->D) " << endl;
126 Ac = A; Bc = B;
127 Af = A; Bf = B;
128#ifndef VSOP_17
129 for(int k=0; k<nloop; k++) {
130 Matrix Dc;
131 (Ac+4.+6.5*Bc).MulElt(Bc-Ac, Dc);
132 Matrix Dcf;
133 (Ac+4.+6.5*Bf).MulElt(Bc-Af, Dcf);
134 Matrix Df;
135 (Af+4.+6.5*Bf).MulElt(Bf-Af, Df);
136 }
137#else
138 for(int k=0; k<nloop; k++) {
139 Matrix Dc;
140 Dc = (Ac+4.+6.5*Bc);
141 Dc.MulElt(Bc-Ac);
142 Matrix Dcf = (Ac+4.+6.5*Bf);
143 Dcf.MulElt(Bc-Af);
144 Matrix Df = (Af+4.+6.5*Bf);
145 Df.MulElt(Bf-Af);
146 }
147#endif
148 nop = nloop*3*nr*nc*5/1000;
[2940]149 cout << "(6.a) Op (A*x+y*B).MulElt(B-A, ->D) (KFLOP) = " << nop << endl;
[2586]150 noptot += nop;
[2940]151 PrtTim(" Apres (6.a) ");
152
153 for(int k=0; k<nloop; k++) {
154 Matrix Dc = (Ac+4.+6.5*Bc) && (Bc-Ac);
155 Matrix Dcf = (Ac+4.+6.5*Bf) && (Bc-Af);
156 Matrix Df = (Af+4.+6.5*Bf) && (Bf-Af);
157 }
158 nop = nloop*3*nr*nc*5/1000;
159 cout << "(6.b) Op D = (A*x+y*B) && (B-A) (KFLOP) = " << nop << endl;
160 noptot += nop;
161 PrtTim(" Apres (6.b) ");
[2586]162 cout << res;
163
164 // Les operations sur sous-tableaux sont beaucoup trop couteux V <= 1.7
165 if (ope > 0) {
[2940]166 cout << "\n(7) Op AA.Row() *= ... [AA.Row()*x+BB.Row()*y ope=2] " << endl;
[2586]167 Ac = A; Bc = B;
168 Af = A; Bf = B;
169#ifdef VSOP_17
170 cout << " !!! Operations couteuses en V<=1.7 " << endl;
171#endif
172 Matrix AA,BB;
173 Vector * vr = new Vector[nr];
174 for(int k=0; k<nloop; k++) {
175 AA = Ac;
176 BB = Bc;
177 for(int r=0; r<nr; r++) {
178 double fac = (5*r+0.33);
179 AA.Row(r) *= fac;
180 BB.Row(r) += AA.Row(r)*4.;
181 if (ope < 2) continue;
182#ifdef VSOP_17
183 // Attention, si on ne fait pas le SetSize a la main, ca explose en memoire en V <= 1.7
184 vr[r].SetSize(AA.Row(r).Size(), AA.Row(r).GetVectorType());
185 vr[r] = AA.Row(r)*3.14+BB.Row(r)*5.6;
186#else
187 vr[r] = AA.Row(r)*3.14+BB.Row(r)*5.6;
188#endif
189 }
190 }
191 if (ope < 2) nop = nloop*nr*nc*3/1000;
192 else nop = nloop*nr*nc*6/1000;
193 cout << "(7) Op AA.Row() *= (KFLOP) = " << nop << endl;
194 noptot += nop;
195 PrtTim(" Apres (7) ");
196 cout << res;
197 delete[] vr;
198 }
199 cout << " ------------------------------------------------- " << endl;
200 cout << res;
201 PrtTim("Fin spar ");
202 cout << " ------ Fin spar N_OP_TOT= " << noptot << " (KFLOP) ------- " << endl;
203}
Note: See TracBrowser for help on using the repository browser.