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