首先,我知道有多个线程涉及这个问题,但是我不能得到一个直接的答案,并遇到了一些失败的计算错误。在
我准备了一个MATLAB和Python的元素乘法基准测试。这是一种最简单、最前沿的方法,可以很容易地计算flop计数。在
它使用NxN数组(matrix),但不执行矩阵乘法,而是按元素进行乘法。这一点很重要,因为当使用矩阵乘法时,运算数不是N^3!!!在
然而,随机生成的数的元素乘法运算必须在N^2次运算中执行
我有一个intel i7-4770(我想它有4个物理核和8个虚拟核)@3.5GHz。所以如果假设每个周期有4次浮点运算,那么每个核心应该是14次浮点运算!在
MATLAB/Numpy/Scipy别靠近它。在
为什么?在
MATLAB软件:%element wise multiplication benchmark
N = 10^4;
nOps = N^2;
m1 = randn(N);
m2 = randn(size(m1));
m = randn(size(m1));
m1 = single(m1);
m2 = single(m2);
% clear m
tic
m1 = m1 .* m2;
t = toc;
gflops = nOps/t*1e-9;
t_gflops = [t gflops]
% clear m
tic
m1 = m1.*m2;
t = toc;
gflops = nOps/t*1e-9;
t_gflops = [t gflops]
% clear m
tic
m1 = m1.*m2;
t = toc;
gflops = nOps/t*1e-9;
t_gflops = [t gflops]
version('-blas')
version('-lapack')
结果是:
^{pr2}$
现在Python:import numpy as np
# import gnumpy as gnp
import scipy as sp
import scipy.linalg as la
import time
if __name__ == '__main__':
N = 10**4
nOps = N**2
a = np.random.randn(N,N).astype(np.float32)
b = np.random.randn(N,N).astype(np.float32)
t = time.time()
c = a*