我想知道 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.4Ghz 笔记本电脑上运行,没有线程发生) 这意味着我的电脑在 1 秒多一点的时间内进行了 ~10^10 次操作。
这怎么可能??
最佳答案
它是几件事的组合:
- Matlab 确实是多线程的。
- 内核使用向量指令进行了高度优化。
这是我机器上的数字: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%
的效率。
我没有看到任何异常。
关于performance - Matlab矩阵乘法速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12721912/