Chris@372
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
Chris@372
|
2
|
Chris@372
|
3 #include "bqvec/VectorOpsComplex.h"
|
Chris@372
|
4
|
Chris@372
|
5 #include <iostream>
|
Chris@372
|
6 #include <cstdlib>
|
Chris@372
|
7
|
Chris@372
|
8 #include <time.h>
|
Chris@372
|
9
|
Chris@372
|
10 using namespace std;
|
Chris@372
|
11 using namespace breakfastquay;
|
Chris@372
|
12
|
Chris@372
|
13 //!!! This is nonsense. TODO: Replace it with sense.
|
Chris@372
|
14
|
Chris@372
|
15 #ifdef _WIN32
|
Chris@372
|
16 #define drand48() (-1+2*((float)rand())/RAND_MAX)
|
Chris@372
|
17 #endif
|
Chris@372
|
18
|
Chris@372
|
19 bool
|
Chris@372
|
20 testMultiply()
|
Chris@372
|
21 {
|
Chris@372
|
22 cerr << "testVectorOps: testing v_multiply complex" << endl;
|
Chris@372
|
23
|
Chris@372
|
24 const int N = 1024;
|
Chris@372
|
25 //!!! todo: use aligned allocate(), otherwise results will vary randomly
|
Chris@372
|
26 bq_complex_t target[N];
|
Chris@372
|
27 bq_complex_t src1[N];
|
Chris@372
|
28 bq_complex_t src2[N];
|
Chris@372
|
29
|
Chris@372
|
30 for (int i = 0; i < N; ++i) {
|
Chris@372
|
31 src1[i].re = drand48();
|
Chris@372
|
32 src1[i].im = drand48();
|
Chris@372
|
33 src2[i].re = drand48();
|
Chris@372
|
34 src2[i].im = drand48();
|
Chris@372
|
35 }
|
Chris@372
|
36
|
Chris@372
|
37 double mean, first, last, total = 0;
|
Chris@372
|
38 for (int i = 0; i < N; ++i) {
|
Chris@372
|
39 bq_complex_t result;
|
Chris@372
|
40 c_multiply(result, src1[i], src2[i]);
|
Chris@372
|
41 if (i == 0) first = result.re;
|
Chris@372
|
42 if (i == N-1) last = result.im;
|
Chris@372
|
43 total += result.re;
|
Chris@372
|
44 total += result.im;
|
Chris@372
|
45 }
|
Chris@372
|
46 mean = total / (N*2);
|
Chris@372
|
47 cerr << "Naive method: mean = " << mean << ", first = " << first
|
Chris@372
|
48 << ", last = " << last << endl;
|
Chris@372
|
49
|
Chris@372
|
50 v_multiply_to(target, src1, src2, N);
|
Chris@372
|
51 total = 0;
|
Chris@372
|
52
|
Chris@372
|
53 for (int i = 0; i < N; ++i) {
|
Chris@372
|
54 if (i == 0) first = target[i].re;
|
Chris@372
|
55 if (i == N-1) last = target[i].im;
|
Chris@372
|
56 total += target[i].re;
|
Chris@372
|
57 total += target[i].im;
|
Chris@372
|
58 }
|
Chris@372
|
59 mean = total / (N*2);
|
Chris@372
|
60 cerr << "v_multiply: mean = " << mean << ", first = " << first
|
Chris@372
|
61 << ", last = " << last << endl;
|
Chris@372
|
62
|
Chris@372
|
63 int iterations = 50000;
|
Chris@372
|
64 // cerr << "Iterations: " << iterations << endl;
|
Chris@372
|
65
|
Chris@372
|
66 // cerr << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << endl;
|
Chris@372
|
67 float divisor = float(CLOCKS_PER_SEC) / 1000.f;
|
Chris@372
|
68
|
Chris@372
|
69 clock_t start = clock();
|
Chris@372
|
70
|
Chris@372
|
71 for (int j = 0; j < iterations; ++j) {
|
Chris@372
|
72 for (int i = 0; i < N; ++i) {
|
Chris@372
|
73 c_multiply(target[i], src1[i], src2[i]);
|
Chris@372
|
74 }
|
Chris@372
|
75 }
|
Chris@372
|
76
|
Chris@372
|
77 clock_t end = clock();
|
Chris@372
|
78
|
Chris@372
|
79 cerr << "Time for naive method: " << float(end - start)/divisor << endl;
|
Chris@372
|
80
|
Chris@372
|
81 start = clock();
|
Chris@372
|
82
|
Chris@372
|
83 for (int j = 0; j < iterations; ++j) {
|
Chris@372
|
84 v_multiply_to(target, src1, src2, N);
|
Chris@372
|
85 }
|
Chris@372
|
86
|
Chris@372
|
87 end = clock();
|
Chris@372
|
88
|
Chris@372
|
89 cerr << "Time for v_multiply: " << float(end - start)/divisor << endl;
|
Chris@372
|
90
|
Chris@372
|
91 return true;
|
Chris@372
|
92 }
|
Chris@372
|
93
|
Chris@372
|
94 bool
|
Chris@372
|
95 testPolarToCart()
|
Chris@372
|
96 {
|
Chris@372
|
97 cerr << "testVectorOps: testing v_polar_to_cartesian" << endl;
|
Chris@372
|
98
|
Chris@372
|
99 const int N = 1024;
|
Chris@372
|
100 bq_complex_t target[N];
|
Chris@372
|
101 bq_complex_element_t mag[N];
|
Chris@372
|
102 bq_complex_element_t phase[N];
|
Chris@372
|
103
|
Chris@372
|
104 for (int i = 0; i < N; ++i) {
|
Chris@372
|
105 mag[i] = drand48();
|
Chris@372
|
106 phase[i] = (drand48() * M_PI * 2) - M_PI;
|
Chris@372
|
107 }
|
Chris@372
|
108
|
Chris@372
|
109 double mean, first, last, total = 0;
|
Chris@372
|
110 for (int i = 0; i < N; ++i) {
|
Chris@372
|
111 double real = mag[i] * cos(phase[i]);
|
Chris@372
|
112 double imag = mag[i] * sin(phase[i]);
|
Chris@372
|
113 if (i == 0) first = real;
|
Chris@372
|
114 if (i == N-1) last = imag;
|
Chris@372
|
115 total += real;
|
Chris@372
|
116 total += imag;
|
Chris@372
|
117 }
|
Chris@372
|
118 mean = total / (N*2);
|
Chris@372
|
119 cerr << "Naive method: mean = " << mean << ", first = " << first
|
Chris@372
|
120 << ", last = " << last << endl;
|
Chris@372
|
121
|
Chris@372
|
122 v_polar_to_cartesian(target, mag, phase, N);
|
Chris@372
|
123
|
Chris@372
|
124 total = 0;
|
Chris@372
|
125
|
Chris@372
|
126 for (int i = 0; i < N; ++i) {
|
Chris@372
|
127 if (i == 0) first = target[i].re;
|
Chris@372
|
128 if (i == N-1) last = target[i].im;
|
Chris@372
|
129 total += target[i].re;
|
Chris@372
|
130 total += target[i].im;
|
Chris@372
|
131 }
|
Chris@372
|
132 mean = total / (N*2);
|
Chris@372
|
133 cerr << "v_polar_to_cartesian: mean = " << mean << ", first = " << first
|
Chris@372
|
134 << ", last = " << last << endl;
|
Chris@372
|
135
|
Chris@372
|
136 int iterations = 10000;
|
Chris@372
|
137 // cerr << "Iterations: " << iterations << endl;
|
Chris@372
|
138
|
Chris@372
|
139 // cerr << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << endl;
|
Chris@372
|
140 float divisor = float(CLOCKS_PER_SEC) / 1000.f;
|
Chris@372
|
141
|
Chris@372
|
142 clock_t start = clock();
|
Chris@372
|
143
|
Chris@372
|
144 for (int j = 0; j < iterations; ++j) {
|
Chris@372
|
145 for (int i = 0; i < N; ++i) {
|
Chris@372
|
146 target[i].re = mag[i] * cos(phase[i]);
|
Chris@372
|
147 target[i].im = mag[i] * sin(phase[i]);
|
Chris@372
|
148 }
|
Chris@372
|
149 }
|
Chris@372
|
150
|
Chris@372
|
151 clock_t end = clock();
|
Chris@372
|
152
|
Chris@372
|
153 cerr << "Time for naive method: " << float(end - start)/divisor << endl;
|
Chris@372
|
154
|
Chris@372
|
155 start = clock();
|
Chris@372
|
156
|
Chris@372
|
157 for (int j = 0; j < iterations; ++j) {
|
Chris@372
|
158 v_polar_to_cartesian(target, mag, phase, N);
|
Chris@372
|
159 }
|
Chris@372
|
160
|
Chris@372
|
161 end = clock();
|
Chris@372
|
162
|
Chris@372
|
163 cerr << "Time for v_polar_to_cartesian: " << float(end - start)/divisor << endl;
|
Chris@372
|
164
|
Chris@372
|
165 return true;
|
Chris@372
|
166 }
|
Chris@372
|
167
|
Chris@372
|
168 bool
|
Chris@372
|
169 testPolarToCartInterleaved()
|
Chris@372
|
170 {
|
Chris@372
|
171 cerr << "testVectorOps: testing v_polar_interleaved_to_cartesian" << endl;
|
Chris@372
|
172
|
Chris@372
|
173 const int N = 1024;
|
Chris@372
|
174 bq_complex_t target[N];
|
Chris@372
|
175 bq_complex_element_t source[N*2];
|
Chris@372
|
176
|
Chris@372
|
177 for (int i = 0; i < N; ++i) {
|
Chris@372
|
178 source[i*2] = drand48();
|
Chris@372
|
179 source[i*2+1] = (drand48() * M_PI * 2) - M_PI;
|
Chris@372
|
180 }
|
Chris@372
|
181
|
Chris@372
|
182 double mean, first, last, total = 0;
|
Chris@372
|
183 for (int i = 0; i < N; ++i) {
|
Chris@372
|
184 double real = source[i*2] * cos(source[i*2+1]);
|
Chris@372
|
185 double imag = source[i*2] * sin(source[i*2+1]);
|
Chris@372
|
186 if (i == 0) first = real;
|
Chris@372
|
187 if (i == N-1) last = imag;
|
Chris@372
|
188 total += real;
|
Chris@372
|
189 total += imag;
|
Chris@372
|
190 }
|
Chris@372
|
191 mean = total / (N*2);
|
Chris@372
|
192 cerr << "Naive method: mean = " << mean << ", first = " << first
|
Chris@372
|
193 << ", last = " << last << endl;
|
Chris@372
|
194
|
Chris@372
|
195 v_polar_interleaved_to_cartesian(target, source, N);
|
Chris@372
|
196
|
Chris@372
|
197 total = 0;
|
Chris@372
|
198
|
Chris@372
|
199 for (int i = 0; i < N; ++i) {
|
Chris@372
|
200 if (i == 0) first = target[i].re;
|
Chris@372
|
201 if (i == N-1) last = target[i].im;
|
Chris@372
|
202 total += target[i].re;
|
Chris@372
|
203 total += target[i].im;
|
Chris@372
|
204 }
|
Chris@372
|
205 mean = total / (N*2);
|
Chris@372
|
206 cerr << "v_polar_interleaved_to_cartesian: mean = " << mean << ", first = " << first
|
Chris@372
|
207 << ", last = " << last << endl;
|
Chris@372
|
208
|
Chris@372
|
209 int iterations = 10000;
|
Chris@372
|
210 // cerr << "Iterations: " << iterations << endl;
|
Chris@372
|
211
|
Chris@372
|
212 // cerr << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << endl;
|
Chris@372
|
213 float divisor = float(CLOCKS_PER_SEC) / 1000.f;
|
Chris@372
|
214
|
Chris@372
|
215 clock_t start = clock();
|
Chris@372
|
216
|
Chris@372
|
217 for (int j = 0; j < iterations; ++j) {
|
Chris@372
|
218 for (int i = 0; i < N; ++i) {
|
Chris@372
|
219 target[i].re = source[i*2] * cos(source[i*2+1]);
|
Chris@372
|
220 target[i].im = source[i*2] * sin(source[i*2+1]);
|
Chris@372
|
221 }
|
Chris@372
|
222 }
|
Chris@372
|
223
|
Chris@372
|
224 clock_t end = clock();
|
Chris@372
|
225
|
Chris@372
|
226 cerr << "Time for naive method: " << float(end - start)/divisor << endl;
|
Chris@372
|
227
|
Chris@372
|
228 start = clock();
|
Chris@372
|
229
|
Chris@372
|
230 for (int j = 0; j < iterations; ++j) {
|
Chris@372
|
231 v_polar_interleaved_to_cartesian(target, source, N);
|
Chris@372
|
232 }
|
Chris@372
|
233
|
Chris@372
|
234 end = clock();
|
Chris@372
|
235
|
Chris@372
|
236 cerr << "Time for v_polar_interleaved_to_cartesian: " << float(end - start)/divisor << endl;
|
Chris@372
|
237
|
Chris@372
|
238 return true;
|
Chris@372
|
239 }
|
Chris@372
|
240
|
Chris@372
|
241 bool
|
Chris@372
|
242 testCartToPolar()
|
Chris@372
|
243 {
|
Chris@372
|
244 cerr << "testVectorOps: testing v_cartesian_to_polar" << endl;
|
Chris@372
|
245
|
Chris@372
|
246 const int N = 1024;
|
Chris@372
|
247 bq_complex_t source[N];
|
Chris@372
|
248 bq_complex_element_t mag[N];
|
Chris@372
|
249 bq_complex_element_t phase[N];
|
Chris@372
|
250
|
Chris@372
|
251 for (int i = 0; i < N; ++i) {
|
Chris@372
|
252 source[i].re = (drand48() * 2.0) - 1.0;
|
Chris@372
|
253 source[i].im = (drand48() * 2.0) - 1.0;
|
Chris@372
|
254 }
|
Chris@372
|
255
|
Chris@372
|
256 double mean, first, last, total = 0;
|
Chris@372
|
257 for (int i = 0; i < N; ++i) {
|
Chris@372
|
258 double mag = sqrt(source[i].re * source[i].re + source[i].im * source[i].im);
|
Chris@372
|
259 double phase = atan2(source[i].im, source[i].re);
|
Chris@372
|
260 if (i == 0) first = mag;
|
Chris@372
|
261 if (i == N-1) last = phase;
|
Chris@372
|
262 total += mag;
|
Chris@372
|
263 total += phase;
|
Chris@372
|
264 }
|
Chris@372
|
265 mean = total / (N*2);
|
Chris@372
|
266 cerr << "Naive method: mean = " << mean << ", first = " << first
|
Chris@372
|
267 << ", last = " << last << endl;
|
Chris@372
|
268
|
Chris@372
|
269 v_cartesian_to_polar(mag, phase, source, N);
|
Chris@372
|
270
|
Chris@372
|
271 total = 0;
|
Chris@372
|
272
|
Chris@372
|
273 for (int i = 0; i < N; ++i) {
|
Chris@372
|
274 if (i == 0) first = mag[i];
|
Chris@372
|
275 if (i == N-1) last = phase[i];
|
Chris@372
|
276 total += mag[i];
|
Chris@372
|
277 total += phase[i];
|
Chris@372
|
278 }
|
Chris@372
|
279 mean = total / (N*2);
|
Chris@372
|
280 cerr << "v_cartesian_to_polar: mean = " << mean << ", first = " << first
|
Chris@372
|
281 << ", last = " << last << endl;
|
Chris@372
|
282
|
Chris@372
|
283 int iterations = 10000;
|
Chris@372
|
284 // cerr << "Iterations: " << iterations << endl;
|
Chris@372
|
285
|
Chris@372
|
286 // cerr << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << endl;
|
Chris@372
|
287 float divisor = float(CLOCKS_PER_SEC) / 1000.f;
|
Chris@372
|
288
|
Chris@372
|
289 clock_t start = clock();
|
Chris@372
|
290
|
Chris@372
|
291 for (int j = 0; j < iterations; ++j) {
|
Chris@372
|
292 for (int i = 0; i < N; ++i) {
|
Chris@372
|
293 mag[i] = sqrt(source[i].re * source[i].re + source[i].im * source[i].im);
|
Chris@372
|
294 phase[i] = atan2(source[i].im, source[i].re);
|
Chris@372
|
295 }
|
Chris@372
|
296 }
|
Chris@372
|
297
|
Chris@372
|
298 clock_t end = clock();
|
Chris@372
|
299
|
Chris@372
|
300 cerr << "Time for naive method: " << float(end - start)/divisor << endl;
|
Chris@372
|
301
|
Chris@372
|
302 start = clock();
|
Chris@372
|
303
|
Chris@372
|
304 for (int j = 0; j < iterations; ++j) {
|
Chris@372
|
305 v_cartesian_to_polar(mag, phase, source, N);
|
Chris@372
|
306 }
|
Chris@372
|
307
|
Chris@372
|
308 end = clock();
|
Chris@372
|
309
|
Chris@372
|
310 cerr << "Time for v_cartesian_to_polar: " << float(end - start)/divisor << endl;
|
Chris@372
|
311
|
Chris@372
|
312 return true;
|
Chris@372
|
313 }
|
Chris@372
|
314
|
Chris@372
|
315 int main(int, char **)
|
Chris@372
|
316 {
|
Chris@372
|
317 if (!testMultiply()) return 1;
|
Chris@372
|
318 if (!testPolarToCart()) return 1;
|
Chris@372
|
319 if (!testPolarToCartInterleaved()) return 1;
|
Chris@372
|
320 if (!testCartToPolar()) return 1;
|
Chris@372
|
321 return 0;
|
Chris@372
|
322 }
|
Chris@372
|
323
|