【问题标题】:Can I speed up my MATLAB code using a MEX-file if the bottleneck is a big matrix multiplication?如果瓶颈是大矩阵乘法,我可以使用 MEX 文件加速我的 MATLAB 代码吗?
【发布时间】:2013-02-25 09:28:40
【问题描述】:

我有一个项目,需要我在 while 循环内多次设置两个大矩阵的乘法。对于较大的矩阵,代码运行速度会非常慢。

我只是好奇,此时使用 mex 和 .cpp 文件是否真的可以提高我的程序速度。 MATLAB内置的矩阵乘法不是已经很不错了吗?

【问题讨论】:

  • 您是通过循环将矩阵的单个元素相乘,还是通过循环将整个矩阵多次相乘?如果是前者,您应该尝试向量化您的 MATLAB 代码。如果是后者,您不太可能看到将代码转换为 C++ 的任何速度。如果您非常了解 BLAS 和 LAPACK 库,您可能会有机会,但即便如此,它也可能不足以值得付出努力。
  • 很大程度上取决于 MatLab 版本和配置。学生版的 MatLab 似乎没有使用多线程矩阵乘法。
  • @Praetorian 我通过循环多次谈论整个矩阵乘法。对于大规模问题,我可能只需要完全退出 MATLAB。真是太糟糕了,MATLAB 有很多不错的功能。
  • 很难相信您可以帮助加快 matlab 的矩阵乘法,请查看以下问题了解更多信息:fast matrix multiplication in MatlabWhy is MATLAB so fast in matrix multiplication?
  • 简短回答 - 不。 Matlab 的矩阵乘法程序会非常非常快。你能发布你想做的事吗?通常有一些方法可以进行矩阵乘法。

标签: c++ matlab


【解决方案1】:

如果没有关于您的问题的更具体信息,任何人都无法说出具体的内容。在某些情况下,MEX 函数肯定可以提高性能,而在某些情况下却不能。矩阵乘法是 Matlab 的优势之一,简单地将矩阵乘法移动到 MEX 函数中不太可能使您的代码运行得更快。

也就是说,有一些提高性能的一般策略:

  1. Profile 你的代码。 确保矩阵乘法实际上是罪魁祸首。以我自己的经验,性能问题可能来自多种来源,包括对临时变量的粗心使用。这应该永远是你的第一步。

  2. 如果您的矩阵具有任何类型的结构,请利用它。 Matlab 对sparsebanded 矩阵有很好的支持。如果你的矩阵有结构,使用它可以大大降低矩阵运算的成本。

  3. 如果您确实编写了 MEX 函数,请尝试将整个 while 循环移动到 MEX 函数中,以避免多次越过 Matlab/MEX 边界。重复调用 MEX 函数可能会非常昂贵,而且在 MEX 函数中执行整个循环通常同样容易(或更容易),尤其是在循环是简单迭代的情况下。

【讨论】:

    【解决方案2】:

    首先,我假设这些矩阵彼此相关,随着时间的推移或类似的情况而演变。如果从一个实例到下一个实例的每个矩阵完全不相关,这将无济于事。 但是,如果它们是相关的,我会想到矩阵的变化可能很小甚至稀疏。给定你的基本方程 C(i) = A(i)*B(i) 如果您创建增量矩阵 Da = A(i+1) - A(i) Db = B(i+1) - B(i) 那么当然 C(i+1) = C(i) + Da*B(i) + A(i)*Db + Da*Db 其中 C(i) 是已知的。如果 Da 和 Db 很小或很稀疏,这 3 个矩阵乘法可能会快得多。它们甚至可能是正交的并且最后一项被丢弃,或者它的结果在数量级上被忽略了。 只是一个想法。 Matlab 矩阵问题有很多工具,不要放弃 Matlab!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-23
      • 2021-03-05
      • 2012-09-25
      • 2011-07-24
      • 2015-07-08
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      相关资源
      最近更新 更多