Mer*_*ury 7 performance matlab matrix time-complexity matrix-multiplication
我想知道matlab如何能够如此快速地乘以两个矩阵.当乘以两个N×N矩阵时,执行N ^ 3次乘法.即使使用Strassen算法,它也需要N ^ 2.8次乘法,这仍然是一个很大的数字.我正在运行以下测试程序:
a = rand(2160);
b = rand(2160);
tic;a*b;toc
Run Code Online (Sandbox Code Playgroud)
使用2160是因为2160 ^ 3 = ~10 ^ 10(a*b应该是大约10 ^ 10次乘法)
我有:
Elapsed time is 1.164289 seconds.
Run Code Online (Sandbox Code Playgroud)
(我在2.4Ghz笔记本上运行,没有发生线程)这意味着我的计算机在1秒多一点的时间内完成了10 ^ 10的操作.
怎么会这样?
Mys*_*ial 13
这是几件事的组合:
这是我机器上的数字:Core i7 920 @ 3.5 GHz(4核)
>> a = rand(10000);
>> b = rand(10000);
>> tic;a*b;toc
Elapsed time is 52.624931 seconds.
Run Code Online (Sandbox Code Playgroud)
任务管理器显示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
Run Code Online (Sandbox Code Playgroud)
因此,Matlab正在实现1 / 1.47 = 68%最大可能的CPU吞吐量的效率.
我没有看到任何与众不同的东西.
要检查是否在MATLAB中使用多线程,请使用此命令
maxNumCompThreads(n)
Run Code Online (Sandbox Code Playgroud)
这将设置要使用的核心数量设置为n.现在我有一个Core i7-2620M,其最高频率为2.7GHz,但它也有一个3.4GHz的turbo模式.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.
Run Code Online (Sandbox Code Playgroud)
所以有多线程.
我们来看一下单CPU结果.A*B执行大约5000 ^ 3次乘法和加法.所以单线程代码的性能是
5000^3*2/10.8 = 23 GFLOP/s
Run Code Online (Sandbox Code Playgroud)
现在的CPU.3.4 GHz,Sandy Bridge每个周期最多可以使用AVX执行8个FLOP:
3.4 [Ginstructions/second] * 8 [FLOPs/instruction] = 27.2 GFLOP/s peak performance
Run Code Online (Sandbox Code Playgroud)
因此,单核性能峰值约为85%,这是该问题的预期.
您真的需要深入了解CPU的功能,以获得准确的性能估计.
| 归档时间: |
|
| 查看次数: |
2951 次 |
| 最近记录: |