История изменений
Исправление 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 раз быстрее на умножении. Охренеть!