【问题标题】:fast matrix multiplication in MatlabMatlab中的快速矩阵乘法
【发布时间】:2011-11-30 12:08:53
【问题描述】:

我需要在 Matlab 中进行非常大的矩阵/向量乘法:“A”是 655360 x 5 实值矩阵,不一定是稀疏的,“B”是 655360 x 1 实值向量。我的问题是如何有效地计算:B'*A。

我注意到通过计算 A'*B 可以稍微缩短时间,这会给出一个列向量。但是还是很慢(我需要在程序中多次执行这个操作)。

通过一点点搜索,我发现了 James Tursa 的一个有趣的 Matlab 工具箱MTIMESX,我希望它可以提高上述矩阵乘法的性能。经过几次试验,我只能比 Matlab 原生矩阵乘法获得非常微不足道的收益。

关于我应该如何重写 A'*B 以提高操作效率的任何建议?谢谢。

【问题讨论】:

  • 我认为对于矩阵运算,Matlab 的性能已经接近你所能拥有的最好的,因为矩阵运算已经被优化和并行化了。
  • 这里提到的许多 Matlab 处理这种矩阵乘法应该没有问题。但是,您的问题表明您的代码或系统存在非常非常大的问题:在我的 i7 机器上乘以这种大小的向量大约需要 0.003 秒。即使我们假设旧机器慢 300 倍,计算时间也应该不到一秒!由于矩阵“A”只需要 26 MB 的内存,因此也不存在内存问题。

标签: performance matlab matrix matrix-multiplication


【解决方案1】:

Matlab 的存在理由是进行矩阵计算。如果您使用手工制作的工具可以显着超越其内置的矩阵乘法,我会感到相当惊讶。首先,你应该确保你的乘法实际上可以更快地执行。您可以通过在 C++ 中使用 Eigen 实现类似的乘法来做到这一点。

【讨论】:

    【解决方案2】:

    为了避免转置操作,您可以尝试:

    sum(bsxfun(@times, A, B), 2)
    

    但我会很惊讶它比直接版本更快。请参阅@thiton 的回答。

    同时查看http://www.mathworks.co.uk/company/newsletters/news_notes/june07/patterns.html,了解为什么基于列向量的版本比基于行向量的版本更快。

    【讨论】:

    • 谢谢。事实上,要击败原生的 Matlab 矩阵乘法是非常困难的。如果我将 bsxffun 与 sum 一起使用,则需要更多时间
    【解决方案3】:

    使用 GPU 进行 matlab 矩阵乘法我得到了很好的结果

    【讨论】:

    • 并行计算能力似乎已经集成在新的 Matlab 版本中,具有“gpuArray”等功能。
    【解决方案4】:

    如果这是您的瓶颈,您的第一选择是重新检查您的算法。请参阅此问题Optimizing MATLAB code,了解选择不同算法如何将运行时间减少三个数量级的一个很好的示例。

    【讨论】:

      【解决方案5】:

      Matlab 是使用相当优化的库(BLAS 等)构建的,因此您无法在 Matlab 中轻松对其进行改进。您可以改进的地方是获得更好的 BLAS,例如为您的处理器优化的 BLAS - 这将通过从主内存中获取适当大小的数据块来更好地使用缓存。看看如何创建您自己的 ATLAS、ACML、MKL 和 Goto BLAS 编译版本。

      我不会尝试解决这个特殊的乘法,除非它真的要了你的命。更改 BLAS 可能会带来更令人满意的解决方案,尤其是在您目前没有使用多核处理器的情况下。

      【讨论】:

      • 你能详细说明一下吗?如何获得更好的 BLAS,然后告诉 Matlab 使用它?如果有更好的 BLAS 可用,为什么 Matlab 不使用它?
      猜你喜欢
      • 1970-01-01
      • 2017-01-25
      • 2012-09-25
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 2020-10-01
      相关资源
      最近更新 更多