Chris@29
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
Chris@29
|
2
|
Chris@29
|
3 #include "bqvec/VectorOpsComplex.h"
|
Chris@29
|
4
|
Chris@29
|
5 #include <iostream>
|
Chris@29
|
6 #include <cstdlib>
|
Chris@29
|
7
|
Chris@29
|
8 #include <time.h>
|
Chris@29
|
9
|
Chris@29
|
10 using namespace std;
|
Chris@29
|
11
|
Chris@29
|
12 namespace breakfastquay {
|
Chris@29
|
13
|
Chris@29
|
14 namespace Test {
|
Chris@29
|
15
|
Chris@29
|
16 #ifdef _WIN32
|
Chris@29
|
17 #define drand48() (-1+2*((float)rand())/RAND_MAX)
|
Chris@29
|
18 #endif
|
Chris@29
|
19
|
Chris@29
|
20 bool
|
Chris@29
|
21 testMultiply()
|
Chris@29
|
22 {
|
Chris@29
|
23 cerr << "testVectorOps: testing v_multiply complex" << endl;
|
Chris@29
|
24
|
Chris@29
|
25 const int N = 1024;
|
Chris@29
|
26 bq_complex_t target[N];
|
Chris@29
|
27 bq_complex_t src1[N];
|
Chris@29
|
28 bq_complex_t src2[N];
|
Chris@29
|
29
|
Chris@29
|
30 for (int i = 0; i < N; ++i) {
|
Chris@29
|
31 src1[i].re = drand48();
|
Chris@29
|
32 src1[i].im = drand48();
|
Chris@29
|
33 src2[i].re = drand48();
|
Chris@29
|
34 src2[i].im = drand48();
|
Chris@29
|
35 }
|
Chris@29
|
36
|
Chris@29
|
37 double mean, first, last, total = 0;
|
Chris@29
|
38 for (int i = 0; i < N; ++i) {
|
Chris@29
|
39 bq_complex_t result;
|
Chris@29
|
40 c_multiply(result, src1[i], src2[i]);
|
Chris@29
|
41 if (i == 0) first = result.re;
|
Chris@29
|
42 if (i == N-1) last = result.im;
|
Chris@29
|
43 total += result.re;
|
Chris@29
|
44 total += result.im;
|
Chris@29
|
45 }
|
Chris@29
|
46 mean = total / (N*2);
|
Chris@29
|
47 cerr << "Naive method: mean = " << mean << ", first = " << first
|
Chris@29
|
48 << ", last = " << last << endl;
|
Chris@29
|
49
|
Chris@29
|
50 v_multiply(target, src1, src2, N);
|
Chris@29
|
51 total = 0;
|
Chris@29
|
52
|
Chris@29
|
53 for (int i = 0; i < N; ++i) {
|
Chris@29
|
54 if (i == 0) first = target[i].re;
|
Chris@29
|
55 if (i == N-1) last = target[i].im;
|
Chris@29
|
56 total += target[i].re;
|
Chris@29
|
57 total += target[i].im;
|
Chris@29
|
58 }
|
Chris@29
|
59 mean = total / (N*2);
|
Chris@29
|
60 cerr << "v_multiply: mean = " << mean << ", first = " << first
|
Chris@29
|
61 << ", last = " << last << endl;
|
Chris@29
|
62
|
Chris@29
|
63 int iterations = 50000;
|
Chris@29
|
64 cerr << "Iterations: " << iterations << endl;
|
Chris@29
|
65
|
Chris@29
|
66 cerr << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << endl;
|
Chris@29
|
67 float divisor = float(CLOCKS_PER_SEC) / 1000.f;
|
Chris@29
|
68
|
Chris@29
|
69 clock_t start = clock();
|
Chris@29
|
70
|
Chris@29
|
71 for (int j = 0; j < iterations; ++j) {
|
Chris@29
|
72 for (int i = 0; i < N; ++i) {
|
Chris@29
|
73 c_multiply(target[i], src1[i], src2[i]);
|
Chris@29
|
74 }
|
Chris@29
|
75 }
|
Chris@29
|
76
|
Chris@29
|
77 clock_t end = clock();
|
Chris@29
|
78
|
Chris@29
|
79 cerr << "Time for naive method: " << float(end - start)/divisor << endl;
|
Chris@29
|
80
|
Chris@29
|
81 start = clock();
|
Chris@29
|
82
|
Chris@29
|
83 for (int j = 0; j < iterations; ++j) {
|
Chris@29
|
84 v_multiply(target, src1, src2, N);
|
Chris@29
|
85 }
|
Chris@29
|
86
|
Chris@29
|
87 end = clock();
|
Chris@29
|
88
|
Chris@29
|
89 cerr << "Time for v_multiply: " << float(end - start)/divisor << endl;
|
Chris@29
|
90
|
Chris@29
|
91 return true;
|
Chris@29
|
92 }
|
Chris@29
|
93
|
Chris@29
|
94 bool
|
Chris@29
|
95 testPolarToCart()
|
Chris@29
|
96 {
|
Chris@29
|
97 cerr << "testVectorOps: testing v_polar_to_cartesian" << endl;
|
Chris@29
|
98
|
Chris@29
|
99 const int N = 1024;
|
Chris@29
|
100 bq_complex_t target[N];
|
Chris@29
|
101 double mag[N];
|
Chris@29
|
102 double phase[N];
|
Chris@29
|
103
|
Chris@29
|
104 for (int i = 0; i < N; ++i) {
|
Chris@29
|
105 mag[i] = drand48();
|
Chris@29
|
106 phase[i] = (drand48() * M_PI * 2) - M_PI;
|
Chris@29
|
107 }
|
Chris@29
|
108
|
Chris@29
|
109 double mean, first, last, total = 0;
|
Chris@29
|
110 for (int i = 0; i < N; ++i) {
|
Chris@29
|
111 double real = mag[i] * cos(phase[i]);
|
Chris@29
|
112 double imag = mag[i] * sin(phase[i]);
|
Chris@29
|
113 if (i == 0) first = real;
|
Chris@29
|
114 if (i == N-1) last = imag;
|
Chris@29
|
115 total += real;
|
Chris@29
|
116 total += imag;
|
Chris@29
|
117 }
|
Chris@29
|
118 mean = total / (N*2);
|
Chris@29
|
119 cerr << "Naive method: mean = " << mean << ", first = " << first
|
Chris@29
|
120 << ", last = " << last << endl;
|
Chris@29
|
121
|
Chris@29
|
122 v_polar_to_cartesian(target, mag, phase, N);
|
Chris@29
|
123
|
Chris@29
|
124 total = 0;
|
Chris@29
|
125
|
Chris@29
|
126 for (int i = 0; i < N; ++i) {
|
Chris@29
|
127 if (i == 0) first = target[i].re;
|
Chris@29
|
128 if (i == N-1) last = target[i].im;
|
Chris@29
|
129 total += target[i].re;
|
Chris@29
|
130 total += target[i].im;
|
Chris@29
|
131 }
|
Chris@29
|
132 mean = total / (N*2);
|
Chris@29
|
133 cerr << "v_polar_to_cartesian: mean = " << mean << ", first = " << first
|
Chris@29
|
134 << ", last = " << last << endl;
|
Chris@29
|
135
|
Chris@29
|
136 int iterations = 10000;
|
Chris@29
|
137 cerr << "Iterations: " << iterations << endl;
|
Chris@29
|
138
|
Chris@29
|
139 cerr << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << endl;
|
Chris@29
|
140 float divisor = float(CLOCKS_PER_SEC) / 1000.f;
|
Chris@29
|
141
|
Chris@29
|
142 clock_t start = clock();
|
Chris@29
|
143
|
Chris@29
|
144 for (int j = 0; j < iterations; ++j) {
|
Chris@29
|
145 for (int i = 0; i < N; ++i) {
|
Chris@29
|
146 target[i].re = mag[i] * cos(phase[i]);
|
Chris@29
|
147 target[i].im = mag[i] * sin(phase[i]);
|
Chris@29
|
148 }
|
Chris@29
|
149 }
|
Chris@29
|
150
|
Chris@29
|
151 clock_t end = clock();
|
Chris@29
|
152
|
Chris@29
|
153 cerr << "Time for naive method: " << float(end - start)/divisor << endl;
|
Chris@29
|
154
|
Chris@29
|
155 start = clock();
|
Chris@29
|
156
|
Chris@29
|
157 for (int j = 0; j < iterations; ++j) {
|
Chris@29
|
158 v_polar_to_cartesian(target, mag, phase, N);
|
Chris@29
|
159 }
|
Chris@29
|
160
|
Chris@29
|
161 end = clock();
|
Chris@29
|
162
|
Chris@29
|
163 cerr << "Time for v_polar_to_cartesian: " << float(end - start)/divisor << endl;
|
Chris@29
|
164
|
Chris@29
|
165 return true;
|
Chris@29
|
166 }
|
Chris@29
|
167
|
Chris@29
|
168 bool
|
Chris@29
|
169 testPolarToCartInterleaved()
|
Chris@29
|
170 {
|
Chris@29
|
171 cerr << "testVectorOps: testing v_polar_interleaved_to_cartesian" << endl;
|
Chris@29
|
172
|
Chris@29
|
173 const int N = 1024;
|
Chris@29
|
174 bq_complex_t target[N];
|
Chris@29
|
175 double source[N*2];
|
Chris@29
|
176
|
Chris@29
|
177 for (int i = 0; i < N; ++i) {
|
Chris@29
|
178 source[i*2] = drand48();
|
Chris@29
|
179 source[i*2+1] = (drand48() * M_PI * 2) - M_PI;
|
Chris@29
|
180 }
|
Chris@29
|
181
|
Chris@29
|
182 double mean, first, last, total = 0;
|
Chris@29
|
183 for (int i = 0; i < N; ++i) {
|
Chris@29
|
184 double real = source[i*2] * cos(source[i*2+1]);
|
Chris@29
|
185 double imag = source[i*2] * sin(source[i*2+1]);
|
Chris@29
|
186 if (i == 0) first = real;
|
Chris@29
|
187 if (i == N-1) last = imag;
|
Chris@29
|
188 total += real;
|
Chris@29
|
189 total += imag;
|
Chris@29
|
190 }
|
Chris@29
|
191 mean = total / (N*2);
|
Chris@29
|
192 cerr << "Naive method: mean = " << mean << ", first = " << first
|
Chris@29
|
193 << ", last = " << last << endl;
|
Chris@29
|
194
|
Chris@29
|
195 v_polar_interleaved_to_cartesian(target, source, N);
|
Chris@29
|
196
|
Chris@29
|
197 total = 0;
|
Chris@29
|
198
|
Chris@29
|
199 for (int i = 0; i < N; ++i) {
|
Chris@29
|
200 if (i == 0) first = target[i].re;
|
Chris@29
|
201 if (i == N-1) last = target[i].im;
|
Chris@29
|
202 total += target[i].re;
|
Chris@29
|
203 total += target[i].im;
|
Chris@29
|
204 }
|
Chris@29
|
205 mean = total / (N*2);
|
Chris@29
|
206 cerr << "v_polar_interleaved_to_cartesian: mean = " << mean << ", first = " << first
|
Chris@29
|
207 << ", last = " << last << endl;
|
Chris@29
|
208
|
Chris@29
|
209 int iterations = 10000;
|
Chris@29
|
210 cerr << "Iterations: " << iterations << endl;
|
Chris@29
|
211
|
Chris@29
|
212 cerr << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << endl;
|
Chris@29
|
213 float divisor = float(CLOCKS_PER_SEC) / 1000.f;
|
Chris@29
|
214
|
Chris@29
|
215 clock_t start = clock();
|
Chris@29
|
216
|
Chris@29
|
217 for (int j = 0; j < iterations; ++j) {
|
Chris@29
|
218 for (int i = 0; i < N; ++i) {
|
Chris@29
|
219 target[i].re = source[i*2] * cos(source[i*2+1]);
|
Chris@29
|
220 target[i].im = source[i*2] * sin(source[i*2+1]);
|
Chris@29
|
221 }
|
Chris@29
|
222 }
|
Chris@29
|
223
|
Chris@29
|
224 clock_t end = clock();
|
Chris@29
|
225
|
Chris@29
|
226 cerr << "Time for naive method: " << float(end - start)/divisor << endl;
|
Chris@29
|
227
|
Chris@29
|
228 start = clock();
|
Chris@29
|
229
|
Chris@29
|
230 for (int j = 0; j < iterations; ++j) {
|
Chris@29
|
231 v_polar_interleaved_to_cartesian(target, source, N);
|
Chris@29
|
232 }
|
Chris@29
|
233
|
Chris@29
|
234 end = clock();
|
Chris@29
|
235
|
Chris@29
|
236 cerr << "Time for v_polar_interleaved_to_cartesian: " << float(end - start)/divisor << endl;
|
Chris@29
|
237
|
Chris@29
|
238 return true;
|
Chris@29
|
239 }
|
Chris@29
|
240
|
Chris@29
|
241 bool
|
Chris@29
|
242 testVectorOps()
|
Chris@29
|
243 {
|
Chris@29
|
244 if (!testMultiply()) return false;
|
Chris@29
|
245 if (!testPolarToCart()) return false;
|
Chris@29
|
246 if (!testPolarToCartInterleaved()) return false;
|
Chris@29
|
247
|
Chris@29
|
248 return true;
|
Chris@29
|
249 }
|
Chris@29
|
250
|
Chris@29
|
251 }
|
Chris@29
|
252
|
Chris@29
|
253 }
|
Chris@29
|
254
|