diff --git a/src/examples/test_matrix_prod.cpp b/src/examples/test_matrix_prod.cpp index 40b4b6969f4febf216c9a7eb603d0c0c116b9ce7..777483084a6d0b7c5dd6d47b9b0883a38fc37781 100644 --- a/src/examples/test_matrix_prod.cpp +++ b/src/examples/test_matrix_prod.cpp @@ -10,6 +10,50 @@ //std includes #include <ctime> #include <iostream> +#include <iomanip> + +#define INIT_ALL\ + R1.setRandom(s, s);\ + R2.setRandom(s, s);\ + C1.setRandom(s, s);\ + C2.setRandom(s, s); + + +#define LOOP(N,Mo,M1,M2) \ + for (int i = 0; i < N; i++) \ + { \ + Mo = M1 * M2; \ + M1(2,2) += 0.000001; \ + M2(0,0) *= 1.000001; \ + /*M2 = Mo; */\ + } + +#define EVALUATE(N,Mo,M1,M2) \ + t0 = clock(); \ + LOOP(N,Mo,M1,M2) \ + t1 = clock(); \ + std::cout << std::setw(15) << Mo(2,2) << "\t"; + +#define EVALUATE_ALL \ + EVALUATE(N, Ro, R1, R2)\ + std::cout << "Time Ro = R * R: " << (long double)(t1 - t0) * 1e9 / CLOCKS_PER_SEC / N << "ns" << std::endl;\ + EVALUATE(N, Ro, R1, C2)\ + std::cout << "Time Ro = R * C: " << (long double)(t1 - t0) * 1e9 / CLOCKS_PER_SEC / N << "ns" << std::endl;\ + EVALUATE(N, Ro, C1, R2)\ + std::cout << "Time Ro = C * R: " << (long double)(t1 - t0) * 1e9 / CLOCKS_PER_SEC / N << "ns" << std::endl;\ + EVALUATE(N, Ro, C1, C2)\ + std::cout << "Time Ro = C * C: " << (long double)(t1 - t0) * 1e9 / CLOCKS_PER_SEC / N << "ns" << std::endl;\ + EVALUATE(N, Co, R1, R2)\ + std::cout << "Time Co = R * R: " << (long double)(t1 - t0) * 1e9 / CLOCKS_PER_SEC / N << "ns" << std::endl;\ + EVALUATE(N, Co, R1, C2)\ + std::cout << "Time Co = R * C: " << (long double)(t1 - t0) * 1e9 / CLOCKS_PER_SEC / N << "ns" << std::endl;\ + EVALUATE(N, Co, C1, R2)\ + std::cout << "Time Co = C * R: " << (long double)(t1 - t0) * 1e9 / CLOCKS_PER_SEC / N << "ns" << std::endl;\ + EVALUATE(N, Co, C1, C2)\ + std::cout << "Time Co = C * C: " << (long double)(t1 - t0) * 1e9 / CLOCKS_PER_SEC / N \ + << "us <-- this is the Eigen default!" << std::endl; + + /** * We multiply matrices and see how long it takes. @@ -20,10 +64,10 @@ int main() { using namespace Eigen; - int N = 1000000; + int N = 100000; const int S = 6; Matrix<double, 16, S - 3 + 1> results; - clock_t t0; + clock_t t0, t1; { Matrix<double, Dynamic, Dynamic, RowMajor> R1, R2, Ro; @@ -31,152 +75,24 @@ int main() for (int s = 3; s <= S; s++) { - - R1.setRandom(s, s); - R2.setRandom(s, s); - C1.setRandom(s, s); - C2.setRandom(s, s); - std::cout << "Timings for dynamic matrix product. R: row major matrix. C: column major matrix. " << s << "x" << s << " matrices." << std::endl; - t0 = clock(); - for (int i = 0; i < N; i++) - { - Ro = R1 * R2; - R2.setRandom(); - } - std::cout << "TimeRo = R * R: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Ro = R1 * C2; - C2.setRandom(); - } - std::cout << "TimeRo = R * C: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Ro = C1 * R2; - R2.setRandom(); - } - std::cout << "TimeRo = C * R: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Ro = C1 * C2; - C2.setRandom(); - } - std::cout << "TimeRo = C * C: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; + INIT_ALL + EVALUATE_ALL - t0 = clock(); - for (int i = 0; i < N; i++) - { - Co = R1 * R2; - R2.setRandom(); - } - std::cout << "Time Co = R * R: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Co = R1 * C2; - C2.setRandom(); - } - std::cout << "Time Co = R * C: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Co = C1 * R2; - R2.setRandom(); - } - std::cout << "Time Co = C * R: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Co = C1 * C2; - C2.setRandom(); - } - std::cout << "Time Co = C * C: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 - << "us <-- this is the Eigen default!" << std::endl; } } - N *= 10; +// N *= 1000; { const int s = 3; std::cout << "Timings for static matrix product. R: row major matrix. C: column major matrix. " << s << "x" << s << " matrices." << std::endl; Matrix<double, s, s, RowMajor> R1, R2, Ro; Matrix<double, s, s, ColMajor> C1, C2, Co; - t0 = clock(); - for (int i = 0; i < N; i++) - { - Ro = R1 * R2; - R2.setRandom(); - } - std::cout << "TimeRo = R * R: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Ro = R1 * C2; - C2.setRandom(); - } - std::cout << "TimeRo = R * C: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Ro = C1 * R2; - R2.setRandom(); - } - std::cout << "TimeRo = C * R: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Ro = C1 * C2; - C2.setRandom(); - } - std::cout << "TimeRo = C * C: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Co = R1 * R2; - R2.setRandom(); - } - std::cout << "Time Co = R * R: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Co = R1 * C2; - C2.setRandom(); - } - std::cout << "Time Co = R * C: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - t0 = clock(); - for (int i = 0; i < N; i++) - { - Co = C1 * R2; - R2.setRandom(); - } - std::cout << "Time Co = C * R: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Co = C1 * C2; - C2.setRandom(); - } - std::cout << "Time Co = C * C: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 - << "us <-- this is the Eigen default!" << std::endl; + INIT_ALL + EVALUATE_ALL } { const int s = 4; @@ -184,141 +100,20 @@ int main() << " matrices." << std::endl; Matrix<double, s, s, RowMajor> R1, R2, Ro; Matrix<double, s, s, ColMajor> C1, C2, Co; - t0 = clock(); - for (int i = 0; i < N; i++) - { - Ro = R1 * R2; - R2.setRandom(); - } - std::cout << "TimeRo = R * R: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Ro = R1 * C2; - C2.setRandom(); - } - std::cout << "TimeRo = R * C: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Ro = C1 * R2; - R2.setRandom(); - } - std::cout << "TimeRo = C * R: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Ro = C1 * C2; - C2.setRandom(); - } - std::cout << "TimeRo = C * C: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Co = R1 * R2; - R2.setRandom(); - } - std::cout << "Time Co = R * R: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Co = R1 * C2; - C2.setRandom(); - } - std::cout << "Time Co = R * C: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Co = C1 * R2; - R2.setRandom(); - } - std::cout << "Time Co = C * R: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - t0 = clock(); - for (int i = 0; i < N; i++) - { - Co = C1 * C2; - C2.setRandom(); - } - std::cout << "Time Co = C * C: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 - << "us <-- this is the Eigen default!" << std::endl; + INIT_ALL + EVALUATE_ALL } +// N /= 100000; { const int s = 5; std::cout << "Timings for static matrix product. R: row major matrix. C: column major matrix. " << s << "x" << s << " matrices." << std::endl; Matrix<double, s, s, RowMajor> R1, R2, Ro; Matrix<double, s, s, ColMajor> C1, C2, Co; - t0 = clock(); - for (int i = 0; i < N; i++) - { - Ro = R1 * R2; - R2.setRandom(); - } - std::cout << "TimeRo = R * R: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - t0 = clock(); - for (int i = 0; i < N; i++) - { - Ro = R1 * C2; - C2.setRandom(); - } - std::cout << "TimeRo = R * C: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Ro = C1 * R2; - R2.setRandom(); - } - std::cout << "TimeRo = C * R: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Ro = C1 * C2; - C2.setRandom(); - } - std::cout << "TimeRo = C * C: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Co = R1 * R2; - R2.setRandom(); - } - std::cout << "Time Co = R * R: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Co = R1 * C2; - C2.setRandom(); - } - std::cout << "Time Co = R * C: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Co = C1 * R2; - R2.setRandom(); - } - std::cout << "Time Co = C * R: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Co = C1 * C2; - C2.setRandom(); - } - std::cout << "Time Co = C * C: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 - << "us <-- this is the Eigen default!" << std::endl; + INIT_ALL + EVALUATE_ALL } { const int s = 6; @@ -326,97 +121,34 @@ int main() << " matrices." << std::endl; Matrix<double, s, s, RowMajor> R1, R2, Ro; Matrix<double, s, s, ColMajor> C1, C2, Co; - t0 = clock(); - for (int i = 0; i < N; i++) - { - Ro = R1 * R2; - R2.setRandom(); - } - std::cout << "TimeRo = R * R: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - t0 = clock(); - for (int i = 0; i < N; i++) - { - Ro = R1 * C2; - C2.setRandom(); - } - std::cout << "TimeRo = R * C: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Ro = C1 * R2; - R2.setRandom(); - } - std::cout << "TimeRo = C * R: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Ro = C1 * C2; - C2.setRandom(); - } - std::cout << "TimeRo = C * C: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Co = R1 * R2; - R2.setRandom(); - } - std::cout << "Time Co = R * R: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Co = R1 * C2; - C2.setRandom(); - } - std::cout << "Time Co = R * C: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Co = C1 * R2; - R2.setRandom(); - } - std::cout << "Time Co = C * R: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - - t0 = clock(); - for (int i = 0; i < N; i++) - { - Co = C1 * C2; - C2.setRandom(); - } - std::cout << "Time Co = C * C: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 - << "us <-- this is the Eigen default!" << std::endl; + INIT_ALL + EVALUATE_ALL } std::cout << "Test q and R rotations" << std::endl; Eigen::Quaterniond q(Eigen::Vector4d::Random().normalized()); Eigen::Matrix3d R = q.matrix(); - Eigen::Vector3d v((Eigen::Vector3d() << 1, 2, 3).finished()); - Eigen::Vector3d w; + Eigen::Vector3d v; v << 1,2,3; double vn = v.norm(); - N *= 10; + N *= 100; t0 = clock(); for (int i = 0; i < N; i++) { - w = R * v; - v.setRandom(); + v = R * v; } - - std::cout << "Time w = R * v: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; + t1 = clock(); + std::cout << "Time w = R * v: " << (double)(t1 - t0) * 1e9 / CLOCKS_PER_SEC / N << "ns" << std::endl; t0 = clock(); for (int i = 0; i < N; i++) { - w = q * v; - v.setRandom(); + v = q * v; } - std::cout << "Time w = q * v: " << ((double)clock() - t0) / CLOCKS_PER_SEC / N * 1e6 << "us" << std::endl; - + t1 = clock(); + std::cout << "Time w = q * v: " << (double)(t1 - t0) * 1e9 / CLOCKS_PER_SEC / N << "ns" << std::endl; + std::cout << "v norm change: " << 10*log((long double)v.norm()/(long double)vn) << " dB" << std::endl; return 0; }