繁体   English   中英

Matlab和C语言中矩阵乘法速度的比较

[英]Comparision of Speed of matrix multiplication in matlab and C

我们可以通过几种方式进行矩阵乘法。 A和B是两个矩阵,大小为1000 * 1000。

  1. 使用matlab内置矩阵运算符。 A*B
  2. 显式地写两个巢。
  3. 显式地写三个巢。
  4. 动态链接C代码以执行三个嵌套。

结果是

  1. *运算符非常快。 大约需要1秒钟。
  2. 巢巢非常慢,尤其是三个巢穴(500秒)。
  3. C循环比matlab嵌套快10秒钟。

任何人都可以解释以下内容。 为什么*这么快,为什么C循环比在matlab中编写循环更有效。

我使用了另一个软件,而不是matlab来进行计算。 但是我认为类似的推理也应适用。

由于矩阵乘法在Matlab中已高度优化,因此请在后台使用LAPACK库。

您会发现很难击败这些库的性能。 当然,简单的嵌套循环不会考虑缓存的影响 ,因此会表现出糟糕的性能。

matlab是一种解释性语言,C语言已编译。 因此,C循环比matlab循环快得多。 这就解释了2和3之间的区别。

同样,matlab的A * B也是底层的编译代码。 那为什么它仍然比C代码还要快一个数量级呢? 毕竟,如果这只是一个嵌套代码,那真的很简单,并且编译器可以对其进行优化,使其速度与在汇编中编写时一样快。 好吧,答案是它很可能不仅仅是嵌套循环。 简单的嵌套循环算法运行时间为O(n ^ 3),但是如果您递归分解矩阵,则可以相对轻松地获得O(n ^ 2.8)Strassen算法( http://en.wikipedia.org/wiki / Strassen_algorithm )在实践中表现良好; 或者您甚至可以采用不太实用的O(n ^ 2.37)Coppersmith-Winograd算法( http://en.wikipedia.org/wiki/Coppersmith%E2%80%93Winograd_algorithm )。

我敢打赌,matlab使用某种形式的Strassen算法,它不仅具有更好的渐近速度,而且由于最终相乘的子矩阵很小,因此它也具有更好的缓存利用率。

有一个网页使用朴素代码和Blas代码描述了C语言中的矩阵乘法速度:

天真的代码

for (i = 0; i < n; i++)
    for (j = 0; j < n; j++) {
        C[i + j*n] = 0;
        for (k = 0; k < n; k++)
            C[i + j*n] += A[i + k*n]*B[k + n*j];
    }

BLAS代码

dgemm_(&charN, &charN, &n, &n, &n, &one_d, A, &n, B, &n, &zero_d, C, &n);

显示 在此处输入图片说明在此处输入图片说明在此处输入图片说明

使用这些库并提高速度可能是一个不错的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM