Matlab矩阵乘法速度

7

我在想Matlab如何如此快速地计算两个矩阵的乘积。当两个N x N的矩阵相乘时,需要进行N^3次乘法运算。即使使用Strassen算法,也需要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的笔记本电脑,在不使用线程的情况下,我的计算机在一秒钟内进行了约10亿次运算。

这是怎么做到的呢?


4
实际上,Matlab中的“Ma”代表着魔法。 - H.Muster
1
你怎么知道没有线程发生? - nneonneo
你确定它是在CPU上计算的吗?http://www.mathworks.com/discovery/matlab-gpu.html - Ivan Kuckir
Matlab绝对支持多线程。我现在正在我的机器上测试它,它正在使用4个核心。 - Mysticial
Matlab肯定支持多线程,至少在R2011b版本中默认设置下没有操作系统的干扰时是支持的。 - High Performance Mark
这个回答解决了你的问题吗?为什么MATLAB在矩阵乘法中如此快速? - phuclv
2个回答

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.

任务管理器显示CPU使用率为4核。

现在进行一些数学计算:

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%

我没有看到任何异常情况。


矩阵矩阵乘法不仅执行乘法,还执行加法。我认为您的性能估计应该包括每个周期通过SSE的4个FLOP,但是操作数量要增加一倍。我是正确的吗?您的MATLAB是否在使用AVX-enabled BLAS? - angainor
1
@angainor 实际上每个周期只有一个 add 和一个 mul。每个都可以使用 SSE。但是,加法和乘法是独立的执行单元,如果不使用另一个,则无法在一个执行单元上“双倍化”。 - Mysticial
没错。为了分析的完整性,广告应该被包括在内。结果是一样的,只不过你采取了一个非平凡的捷径。对于不知道你在评论中写了什么的人来说可能很难理解。 - angainor
OP 只在计算乘法。我不想让他因为加法而感到困惑(即使它们的结果完全相同)。 - Mysticial
顺便问一下,AVX怎么样了?我只是假设每个周期有8个FLOP。它是否也分为加法和乘法? - angainor
那台机器(Core i7 920)是第一代i7。它没有AVX。我的沙盒有(一个超频的2600K)。但我没有在上面安装Matlab。 - Mysticial

5

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

maxNumCompThreads(n)

这将设置要使用的内核数为n。现在我有一台Core i7-2620M,最高频率为2.7GHz,但是它还有一个3.4GHz的Turbo Boost模式。该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的三次方个乘法加法操作。因此,单线程代码的性能为

5000^3*2/10.8 = 23 GFLOP/s

现在来说CPU。3.4 GHz,使用AVX指令集,Sandy Bridge每个周期最多可以完成8个FLOPs的运算:

3.4 [Ginstructions/second] * 8 [FLOPs/instruction] = 27.2 GFLOP/s peak performance

因此,单核性能大约为峰值的85%,这在这个问题上是可以预料的。

您真的需要深入了解您的CPU的能力,以获得准确的性能估计。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接