void version4(CArray& A, CArray& B, int nIters) { Timer timer; struct cmplx { double re, im; }; cmplx* a = (cmplx*)A.data(); cmplx* b = (cmplx*)B.data(); setup(A,B); int N = A.extent(firstDim); timer.start(); for (int i=0; i < nIters; ++i) { for (int j=0; j < N; ++j) { double ar = a[j].re; double ai = a[j].im; b[j].re += ar*ar - ai*ai; b[j].im += 2 * ar * ai; } } timer.stop(); cout << "Time using really low-level version: " << timer.elapsedSeconds() << endl; }
void version3(CArray& A, CArray& B, int nIters) { Timer timer; int N = A.extent(firstDim); // Low-level implementation setup(A,B); timer.start(); for (int i=0; i < nIters; ++i) { for (int j=0; j < N; ++j) B(j) += A(j) * A(j); } timer.stop(); cout << "Time using low-level version: " << timer.elapsedSeconds() << endl; }