annotate bqvec/test/Timings.cpp @ 372:af71cbdab621 tip

Update bqvec code
author Chris Cannam
date Tue, 19 Nov 2019 10:13:32 +0000
parents
children
rev   line source
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