LINUX.ORG.RU

История изменений

Исправление unanimous, (текущая версия) :

А теперь правильный тест:

$ cat matmultest.cpp 
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <ctime>

using namespace std;

const int n=4096;
double a[n][n], b[n][n], bt[n][n], c[n][n];

int main()
{
        for (int i=0; i<n; i++)
          for (int j=0; j<n; j++) {
            a[i][j] = (rand() % 100)/100.0+1.0;
            b[i][j] = (rand() % 100)/100.0+1.0;
          }

        for (int i=0; i<n; i++)
          for (int j=0; j<n; j++) {
            bt[i][j] = b[j][i];
          }

  clock_t start;
  start = clock();

        for (int i=0; i<n; i++)
          for (int j=0; j<n; j++) {
            double cc = 0;
            for (int k=0; k<n; k++)
                cc += a[i][k]*bt[j][k];
            c[i][j] = cc;
          }

        cout<<(clock()-start)/(double) CLOCKS_PER_SEC<<endl;
        return 0;
}
$ g++ -march=native -Ofast -o matmultest matmultest.cpp
$ ./matmultest
44.5523
$ time ./matmultest
43.2659

real	0m43.954s
user	0m43.880s
sys	0m0.064s
$ cat matmultest.py
#!/usr/bin/env python
from __future__ import print_function

import numpy as np
import random
import time

n = 4096

AA = [[random.uniform(0, 1.1) for x in range(n)] for y in range(n)]
BB = [[random.uniform(0, 1.1) for x in range(n)] for y in range(n)]

AA = np.array(AA)
BB = np.array(BB)

DD = np.empty([n, n], dtype=np.float)

start_time = time.time()

DD = np.matmul(AA, BB)

print(" Time %s seconds:" % (time.time() - start_time))
$ ./matmultest.py
 Time 6.66353106499 seconds:
$ time ./matmultest.py
 Time 6.64229393005 seconds:

real	0m21.877s
user	0m39.236s
sys	0m1.808s

Итого: на матрицах 4096x4096 питон в 2 раза быстрее (с учетом аллокаций) и в 6 раз быстрее на умножении. Охренеть!

Исходная версия unanimous, :

А теперь правильный тест:

]$ cat matmultest.cpp 
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <ctime>

using namespace std;

const int n=4096;
double a[n][n], b[n][n], bt[n][n], c[n][n];

int main()
{
        for (int i=0; i<n; i++)
          for (int j=0; j<n; j++) {
            a[i][j] = (rand() % 100)/100.0+1.0;
            b[i][j] = (rand() % 100)/100.0+1.0;
          }

        for (int i=0; i<n; i++)
          for (int j=0; j<n; j++) {
            bt[i][j] = b[j][i];
          }

  clock_t start;
  start = clock();

        for (int i=0; i<n; i++)
          for (int j=0; j<n; j++) {
            double cc = 0;
            for (int k=0; k<n; k++)
                cc += a[i][k]*bt[j][k];
            c[i][j] = cc;
          }

        cout<<(clock()-start)/(double) CLOCKS_PER_SEC<<endl;
        return 0;
}
$ g++ -march=native -Ofast -o matmultest matmultest.cpp
$ ./matmultest
44.5523
$ time ./matmultest
43.2659

real	0m43.954s
user	0m43.880s
sys	0m0.064s
$ cat matmultest.py
#!/usr/bin/env python
from __future__ import print_function

import numpy as np
import random
import time

n = 4096

AA = [[random.uniform(0, 1.1) for x in range(n)] for y in range(n)]
BB = [[random.uniform(0, 1.1) for x in range(n)] for y in range(n)]

AA = np.array(AA)
BB = np.array(BB)

DD = np.empty([n, n], dtype=np.float)

start_time = time.time()

DD = np.matmul(AA, BB)

print(" Time %s seconds:" % (time.time() - start_time))

$ ./matmultest.py Time 6.66353106499 seconds:

$ time ./matmultest.py
 Time 6.64229393005 seconds:

real	0m21.877s
user	0m39.236s
sys	0m1.808s

Итого: на матрицах 4096x4096 питон в 2 раза быстрее (с учетом аллокаций) и в 6 раз быстрее на умножении. Охренеть!