我想知道matlab如何能够如此快速地乘以两个矩阵。当乘以两个N×N矩阵时,执行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.4Ghz笔记本上运行,没有发生线程) 这意味着我的电脑在1秒多一点的时间内完成了10 ^ 10的操作。
这怎么可能?
答案 0 :(得分:13)
这是几件事的组合:
这是我机器上的数字:Core i7 920 @ 3.5 GHz(4核)
>> a = rand(10000);
>> b = rand(10000);
>> tic;a*b;toc
Elapsed time is 52.624931 seconds.
任务管理器显示4个CPU使用核心。
现在进行一些数学运算:
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实现了最大可能CPU吞吐量的1 / 1.47 = 68%
效率。
我没有看到任何异常。
答案 1 :(得分:5)
要检查您是否在MATLAB中使用多线程,请使用此命令
maxNumCompThreads(n)
这将设置要使用的核心数量为n。现在我有一个Core i7-2620M,其最高频率为2.7GHz,但它还有一个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.4 GHz,Sandy Bridge每个周期最多可以使用AVX进行8次FLOP:
3.4 [Ginstructions/second] * 8 [FLOPs/instruction] = 27.2 GFLOP/s peak performance
因此,单核性能峰值约为85%,这是该问题的预期。
您真的需要深入了解CPU的功能,以获得准确的性能估算。