【问题标题】:How to increase the speed of code written in Matlab如何提高用 Matlab 编写代码的速度
【发布时间】:2015-01-09 23:59:39
【问题描述】:

Mathematica 有一个名为Compile 的功能,通过在 Mathematica 语言中编译您编写的代码,您将其转换为 c 代码并在 Mathematica 中运行生成的代码,它不会给您 c 代码,但它会将代码转换为它并使用它。编译后的代码比未编译的版本快很多。

Matlab 中是否有类似的功能,以便有人可以轻松地更快地编写 Matlab 中的代码而无需额外的努力?

Matlab 编译器似乎没有实现这个目标,因为它确实不打算用于这个目的。 我不知道 Matlab 编码器。我刚刚阅读了一些有关 MEX 文件的内容,但对我来说,似乎我必须用 c 编写代码,然后将其带入 Matlab 以提高速度。

有人可以指导我并举一个简单的例子吗?

【问题讨论】:

  • 为什么不说原因就投反对票?
  • 您希望加快哪种代码?如果它涉及矩阵数学,除非您真的知道自己在做什么,否则您不太可能看到将其转换为 mex 的任何速度。
  • 它涉及到四万个矩阵的乘法作为代码的一部分。除了加快我的代码速度之外,我想知道 Matlab 中是否有相当于 Mathematica 的Compile 功能。
  • 你可以预先解析你的函数,这会显着减少它们的加载时间,但为了更快的速度,你需要用 C++ 重写或改变方法。
  • 参见codercodegen(如果有的话)。 This video 可能会有所帮助。

标签: performance matlab mex


【解决方案1】:

简短的回答:如果有的话,编译 matlab 代码不会让你加快很多速度。

更长的答案: Matlab 编译器 更多的是让您部署 matlab 代码以在没有 matlab 的机器上使用,而不是为了加快速度。事实上,从深入到我使用它部署的应用程序中,它实际上用缩短的 Matlab 运行时间包装了脚本。因此,如果有任何事情,由于解包和启动时间等原因,这会减慢速度。

无论如何,Matlab 中有一些相当不错的即时优化东西,它在编译速度方面照顾了低悬的果实。正如问题 cmets 中提到的 horchler & chappjc,您可以尝试 codegencoder,但您可能不会得到更好的结果。

如果您想尝试通过使用 mexFunction 来加快速度,那么您几乎必须用 c/c++ 或 fortran 重新编写您的函数。根据问题的性质、您的 C/C++ 技能以及您必须花费的时间,这最终可能会提供明显更快的结果,因为它可以利用编译器的优化技巧和手动编码的解决方案可以很好地删除在 matlab 实现中发现的某些多余元素,这些元素对于通用性是必需的。然而,这样做会打破“无需付出巨大努力”的标准。

就省力方法而言,我建议您首先尝试通过使用 profile 来查找瓶颈或不必要的重复,然后尝试 矢量化,从而提高 matlab 代码的效率 尽可能进行计算,以便 matlab 自动并行化它们。

如果您仍然确实需要提升性能并且正在使用 certain matrix functions,那么您可以查看 Matlab 的 GPU 和 CUDA 支持。我自己还没有做太多,但是可能您只需将一些数据类型更改为 gpuArray 即可获得它在显卡上运行的好处(并行计算的提升)。

【讨论】:

  • MATLAB 编译器和 MEX 函数是非常不同的东西。尽管 JIT 对解释的改进是巨大的,但它并没有提供“您从编译中获得的大部分速度优势”。无论如何,都不能与具有良好 C++ 优化器的 MEX 相比。
  • @BenVoigt 诚然,用高效干净的 c++ 重写算法并使用经过适当优化的编译器将为您提供更快的代码。然而,这是一项重大的努力,正如问题中所述,我正在考虑“无需太多额外的努力”。我将编辑我的答案以更好地反映这一点,也许还会提到 GPGPU 措施的可能性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多