Matlab矩阵乘法速度

时间:2012-10-04 07:02:42

标签: performance matlab matrix time-complexity matrix-multiplication

我想知道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的操作。

这怎么可能?

2 个答案:

答案 0 :(得分:13)

这是几件事的组合:

  • 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%效率。

我没有看到任何异常。

答案 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的功能,以获得准确的性能估算。