#include #include // C = A * B static void mult(int n, double * c, double const * a, double const * b) { int in = 0; for (int i = 0; i < n; ++ i, in += n) { int inn = in + n; for (int j = 0; j < n; ++ j) { int kj = j; double cc = 0; for (int ik = in; ik < inn; ++ ik, kj += n) cc += a[ik] * b[kj]; c[in + j] = cc; } } } // C += A static void add(int n, double * c, double const * a) { int nn = n * n; for (int i = 0; i < nn; i++) c[i] += a[i]; } static void init(int n, double * m, int a, int b, double scale) { for (int i = 0; i < n; ++ i) for (int j = 0; j < n; ++ j) m[i * n + j] = (a * i + b * j) / scale; } int main () { int N = 200; int M = 100; double a [N*N]; double b [N*N]; double c [N*N]; init(N, a, 3, 1, 300); init(N, b, 2, 7, 300); double start = clock() * 1000.0 / CLOCKS_PER_SEC; for (int i = 0; i < M; i++) { mult(N, c, a, b); add(N, c, a); add(N, c, b); } double end = clock() * 1000.0 / CLOCKS_PER_SEC; if (fabs(c[N*N-1] - 2487.5) > 1e10) std::cout << "wrong answer" << std::endl; std::cout << ((end - start) / M) << std::endl << std::endl; init(N, a, 3, 1, 300); init(N, b, 2, 7, 300); start = clock() * 1000.0 / CLOCKS_PER_SEC; for (int i = 0; i < M; i++) { mult(N, c, a, b); add(N, c, a); add(N, c, b); } end = clock() * 1000.0 / CLOCKS_PER_SEC; if (fabs(c[N*N-1] - 2487.5) > 1e10) std::cout << "wrong answer" << std::endl; std::cout << ((end - start) / M) << std::endl << std::endl; return 0; }