Matlab矩阵乘法速度

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

这是几件事的组合:

  • Matlab确实是多线程的.
  • 核心通过向量指令进行了大量优化.

这是我机器上的数字: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吞吐量的效率.

我没有看到任何与众不同的东西.


ang*_*nor 5

要检查是否在MATLAB中使用多线程,请使用此命令

maxNumCompThreads(n)
Run Code Online (Sandbox Code Playgroud)

这将设置要使用的核心数量设置为n.现在我有一个Core i7-2620M,其最高频率为2.7GHz,它也有一个3.4GHzturbo模式.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的功能,以获得准确的性能估计.