source: Sophya/trunk/Eval/JET/telacc.cc@ 4054

Last change on this file since 4054 was 4054, checked in by ansari, 14 years ago

ajout programme telacc.cc pour test rapidite acces aux elements, Reza 17/03/2012

File size: 7.0 KB
RevLine 
[4054]1#include "sopnamsp.h"
2#include "machdefs.h"
3#include <stdio.h>
4#include <stdlib.h>
5#include <math.h>
6#include <iostream>
7#include <fstream>
8#include <fcntl.h>
9#include <sys/types.h>
10#include <sys/stat.h>
11
12#include "sophyainit.h"
13#include "timing.h"
14#include "ctimer.h"
15#include "array.h"
16
17/*
18#include "cexpre.h"
19#include "rpneval.h"
20#include "commander.h"
21*/
22
23/*
24 ------ Programme de test de rapidite comparative d'acces aux elements -----
25 Reza+cmv , Mars 2012
26*/
27sa_size_t ASZ=1024*1024*128;
28sa_size_t BSZ=1024*1024*64;
29
30int NLOOP=20;
31
32using namespace std;
33
34class SAA {
35public:
36 SAA(size_t n) { data_=new uint_1[n]; sz_=n; }
37 ~SAA() { delete[] data_; }
38 inline size_t Size() { return sz_; }
39 inline uint_1 & operator[] (size_t k) { return *(data_+k); }
40 uint_1* data_;
41 size_t sz_;
42};
43
44template <class T>
45class TAA {
46public:
47 TAA(size_t n) { data_=new T[n]; sz_=n; for(int i=0; i<50; i++) flags[i]=i+5; }
48 virtual ~TAA() { delete[] data_; }
49 virtual size_t Size() { return sz_; }
50 inline T & operator[] (size_t k) { return *(data_+k); }
51 static int flags[50];
52 T* data_;
53 size_t sz_;
54};
55
56template <class T> int TAA<T>::flags[50];
57
58class WSAA {
59public:
60 WSAA(size_t n) { sa_=new SAA(n); }
61 ~WSAA() { delete sa_; }
62 inline size_t Size() { return sa_->Size(); }
63 inline uint_1 & operator[] (size_t k) { return *(sa_->data_+k); }
64 SAA* sa_;
65};
66
67class SADB {
68public:
69 SADB(size_t n) : ndb_(n) { data_=ndb_.Begin(); sz_=n; }
70 inline size_t Size() { return sz_; }
71 inline uint_1 & operator[] (size_t k) { return *(data_+k); }
72 NDataBlock<uint_1> ndb_;
73 uint_1* data_;
74 size_t sz_;
75};
76
77
78static uint_1 mask_[8]={1,2,4,8,16,32,64,128};
79class SBB {
80public:
81 SBB(size_t n) { size_t n8=n/8; data_=new uint_1[n8]; sz_=n8*8; }
82 ~SBB() { delete[] data_; }
83 inline size_t Size() { return sz_; }
84 inline bool operator[] (size_t k) { return (data_[k/8]&mask_[k%8]); }
85 inline void set(size_t k, bool v) { (v?(data_[k/8]|=mask_[k%8]):(data_[k/8]&=(~mask_[k%8]))); }
86
87 uint_1* data_;
88 size_t sz_;
89};
90
91/* --Main-- */
92int main(int narg, char *arg[])
93{
94 cout << "--- programme telacc.cc : test temps d'acces aux tableaux --- " << endl;
95 if (narg>1) {
96 sa_size_t ifac=atoi(arg[1]);
97 BSZ=1024*1024*ifac;
98 }
99 cout << " telacc.cc BSZ= " << BSZ << endl;
100 Timer tm("ELACC");
101 try {
102 double* x = new double[BSZ];
103 double* y = new double[BSZ];
104 double* z = new double[BSZ];
105 for(sa_size_t k=0; k<BSZ; k++) {
106 x[k]=k*M_PI; y[k]=k*8.7654;
107 }
108 //--------------- single loop step=8 scalar-product
109 double a = 6435.9888;
110 tm.SplitQ();
111 for(int i=0; i<NLOOP; i++) {
112 for(sa_size_t k=0; k<BSZ-2; k+=8) {
113 z[k]=x[k]*(y[k]+a);
114 z[k+1]=x[k+1]*(y[k+1]+a);
115 z[k+2]=x[k+2]*(y[k+2]+a);
116 z[k+3]=x[k+3]*(y[k+3]+a);
117 z[k+4]=x[k+4]*(y[k+4]+a);
118 z[k+5]=x[k+5]*(y[k+5]+a);
119 z[k+6]=x[k+6]*(y[k+6]+a);
120 z[k+7]=x[k+7]*(y[k+7]+a);
121 }
122 }
123 tm.SplitQ();
124 double dnacc=(double)NLOOP*(double)BSZ;
125 cout << " End_X_LOOP_8 CPU= " << tm.PartialCPUTime()*1000. << " ms Elaps= " << tm.PartialElapsedTimems() <<
126 " ms " << tm.PartialCPUTime()*1.e9/dnacc << " ns/elt " << endl;
127
128 //--------------- single loop scalar-product
129 a = 65.9888;
130 tm.SplitQ();
131 for(int i=0; i<NLOOP; i++) {
132 for(sa_size_t k=0; k<BSZ; k++) z[k]=x[k]*(y[k]+a);
133 }
134 tm.SplitQ();
135 cout << " End_X_LOOP CPU= " << tm.PartialCPUTime()*1000. << " ms Elaps= " << tm.PartialElapsedTimems()<<
136 " ms " << tm.PartialCPUTime()*1.e9/dnacc << " ns/elt " << endl;
137
138 uint_1* vb = new uint_1[ASZ];
139 tm.SplitQ();
140 for(int i=0; i<NLOOP; i++) {
141 for(sa_size_t k=0; k<ASZ; k++) vb[k]=7;
142 }
143 tm.SplitQ();
144 dnacc=(double)NLOOP*(double)ASZ;
145 cout << " End_0_Pointer CPU= " << tm.PartialCPUTime()*1000. << " ms Elaps= " << tm.PartialElapsedTimems() <<
146 " ms " << tm.PartialCPUTime()*1.e9/dnacc << " ns/elt " << endl;
147
148 SAA sa(ASZ);
149 tm.SplitQ();
150 for(int i=0; i<NLOOP; i++) {
151 for(sa_size_t k=0; k<ASZ; k++) sa[k]=5;
152 }
153 tm.SplitQ();
154 dnacc=(double)NLOOP*(double)ASZ;
155 cout << " End_A_SAA CPU= " << tm.PartialCPUTime()*1000. << " ms Elaps= " << tm.PartialElapsedTimems() <<
156 " ms " << tm.PartialCPUTime()*1.e9/dnacc << " ns/elt " << endl;
157
158 TAA<uint_1> ta(ASZ);
159 tm.SplitQ();
160 for(int i=0; i<NLOOP; i++) {
161 for(sa_size_t k=0; k<ASZ; k++) ta[k]=5;
162 }
163 tm.SplitQ();
164 dnacc=(double)NLOOP*(double)ASZ;
165 cout << " End_AA_TAA CPU= " << tm.PartialCPUTime()*1000. << " ms Elaps= " << tm.PartialElapsedTimems() <<
166 " ms " << tm.PartialCPUTime()*1.e9/dnacc << " ns/elt " << endl;
167
168 WSAA wsa(ASZ);
169 tm.SplitQ();
170 for(int i=0; i<NLOOP; i++) {
171 for(sa_size_t k=0; k<ASZ; k++) wsa[k]=18;
172 }
173 tm.SplitQ();
174 cout << " End_B_WSAA CPU= " << tm.PartialCPUTime()*1000. << " ms Elaps= " << tm.PartialElapsedTimems() <<
175 " ms " << tm.PartialCPUTime()*1.e9/dnacc << " ns/elt " << endl;
176
177 SBB sb(ASZ);
178 tm.SplitQ();
179 for(int i=0; i<NLOOP; i++) {
180 for(sa_size_t k=0; k<ASZ; k++) sb.set(k,true);
181 }
182 tm.SplitQ();
183 cout << " End_C_SBB CPU= " << tm.PartialCPUTime()*1000. << " ms Elaps= " << tm.PartialElapsedTimems() <<
184 " ms " << tm.PartialCPUTime()*1.e9/dnacc << " ns/elt " << endl;
185
186 SADB sad(ASZ);
187 tm.SplitQ();
188 for(int i=0; i<NLOOP; i++) {
189 for(sa_size_t k=0; k<ASZ; k++) sad[k]=5;
190 }
191 tm.SplitQ();
192 cout << " End_D_SADB CPU= " << tm.PartialCPUTime()*1000. << " ms Elaps= " << tm.PartialElapsedTimems() <<
193 " ms " << tm.PartialCPUTime()*1.e9/dnacc << " ns/elt " << endl;
194
195 NDataBlock<uint_1> db(ASZ);
196 tm.SplitQ();
197 for(int i=0; i<NLOOP; i++) {
198 for(sa_size_t k=0; k<ASZ; k++) db(k)=9;
199 }
200 tm.SplitQ();
201 cout << " End_E_NDataBlock CPU= " << tm.PartialCPUTime()*1000. << " ms Elaps= " << tm.PartialElapsedTimems() <<
202 " ms " << tm.PartialCPUTime()*1.e9/dnacc << " ns/elt " << endl;
203
204 tm.SplitQ();
205 for(int i=0; i<NLOOP; i++) {
206 db=(uint_1)((99+i)%102);
207 }
208 tm.SplitQ();
209 cout << " End_EE_NDataBlock op= CPU= " << tm.PartialCPUTime()*1000. << " ms Elaps= " << tm.PartialElapsedTimems() <<
210 " ms " << tm.PartialCPUTime()*1.e9/dnacc << " ns/elt " << endl;
211
212 TVector<uint_1> va(ASZ);
213 tm.SplitQ();
214 for(int i=0; i<NLOOP; i++) {
215 for(sa_size_t k=0; k<va.Size(); k++) va(k)=3;
216 }
217 tm.SplitQ();
218 cout << " End_F_TVector CPU= " << tm.PartialCPUTime()*1000. << " ms Elaps= " << tm.PartialElapsedTimems() <<
219 " ms " << tm.PartialCPUTime()*1.e9/dnacc << " ns/elt " << endl;
220
221 tm.SplitQ();
222 va=(uint_1)33;
223 for(int i=0; i<NLOOP; i++) {
224 va=(uint_1)((33+i)%37);
225 }
226 tm.SplitQ();
227 cout << " End_FF_TVector op= CPU= " << tm.PartialCPUTime()*1000. << " ms Elaps= " << tm.PartialElapsedTimems() <<
228 " ms " << tm.PartialCPUTime()*1.e9/dnacc << " ns/elt " << endl;
229
230 }
231
232 catch (std::exception & e) {
233 cerr << " telacc.cc: exception catched : e.what()= " << e.what() << endl;
234 }
235 catch (...) {
236 cerr << " telacc.cc: some other exception was caught ! " << endl;
237 }
238
239 cout << "==== FIN programme tmacc.cc ==== " << endl;
240 return(0);
241}
242
Note: See TracBrowser for help on using the repository browser.