我想知道matlab怎么能这么快地把两个矩阵相乘。将两个NxN矩阵相乘时,将执行N^3次乘法。即使使用Strassen Algorithm,它也需要N^2.8次乘法,这仍然是一个很大的数字。我正在运行以下测试程序:
a = rand(2160);
b = rand(2160);
tic;a*b;toc
使用2160是因为2160^3=~10^10 ( a*b应该是大约10^10次乘法)
我得到了:
Elapsed time is 1.164289 seconds.
(我在2.4 and笔记本上运行,没有线程发生),这意味着我的计算机在1秒多一点的时间内进行了~10^10次操作。
怎么会这样呢?
发布于 2012-10-04 07:20:09
它是几个东西的组合:
这是我机器上的数字:核心i7 920 @ 3.5 GHz (4核)
>> a = rand(10000);
>> b = rand(10000);
>> tic;a*b;toc
Elapsed time is 52.624931 seconds.
任务管理器显示CPU使用的4个核心。
现在来做一些数学运算:
Number of multiplies = 10000^3 = 1,000,000,000,000 = 10^12
Max multiplies in 53 secs =
(3.5 GHz) * (4 cores) * (2 mul/cycle via SSE) * (52.6 secs) = 1.47 * 10^12
所以Matlab正在实现1 / 1.47 = 68%
效率的最大可能吞吐量。
我看不出有什么异常。
发布于 2012-10-04 07:51:34
要检查是否在MATLAB中使用多线程,请使用以下命令
maxNumCompThreads(n)
现在我有一个Corei7-2620M,它的最大频率是2.7 the,,但是它也有一个turbo mode with 3.4GHz。CPU有两个核心。让我们看看:
A = rand(5000);
B = rand(5000);
maxNumCompThreads(1);
tic; C=A*B; toc
Elapsed time is 10.167093 seconds.
maxNumCompThreads(2);
tic; C=A*B; toc
Elapsed time is 5.864663 seconds.
所以就有了多线程。
让我们来看看单CPU的结果。A*B执行大约5000^3次乘法和加法。因此,单线程代码的性能是
5000^3*2/10.8 = 23 GFLOP/s
现在是CPU。3.4Avx,沙桥每个周期最多可以做8次GHz:
3.4 [Ginstructions/second] * 8 [FLOPs/instruction] = 27.2 GFLOP/s peak performance
因此,单核性能约为85%的峰值,这在这个问题上是可以预期的。
你真的需要深入研究你的CPU的能力,以获得准确的性能估计。
https://stackoverflow.com/questions/12721912
复制