罗兰关于MATLAB的艺术

将想法转化为MATLAB

使用新的MATLAB执行引擎运行代码更快

今天我想向你们介绍一位客座博主,Dave Bergstein,他是MathWorks的MATLAB产品经理。今天,Dave将讨论新的MATLAB执行引擎。

内容

重新设计的执行

在R2015b中,我们通过引入新的MATLAB执行引擎改变了所有MATLAB代码的执行方式。改进后的体系结构运行MATLAB程序更快,并为未来的增强提供了一个平台。这些好处不需要修改代码。

看看一些客户对新执行引擎的看法:

“我与各种各样的客户一起工作,花时间帮助他们中的许多人加快他们现有的MATLAB代码。看到新的执行引擎对性能的帮助,我非常兴奋。一个客户报告说,一个关键的性能关键流程现在在R2015b的运行速度是原来的两倍,这对他们的日常运营产生了显著的积极影响。”实验后奥特曼
MATLAB专家,加速MATLAB性能(CRC出版社)一书的作者

“新的MATLAB执行引擎在R2015减半了我们的MATLAB代码的执行时间。”罗伯特·丹弗斯
主管-科勒公司工程,分析建模和测试实验室

“我的应用程序——”用于传热和流体流动的1D和2D有限体积——“性能明显更好——”大约好了35%。好工作!”恩里科高贵的
意大利里雅斯特大学工程与建筑系热力学与传热教授

对您来说意味着:更好的性能、质量和可扩展性

新的执行引擎从一开始就考虑到了性能。以下是一些有显著改进的特定语言领域:

  • 函数调用:大大减少了函数调用开销;将代码组织成许多小函数不再有明显的性能损失。
  • 面向对象的特点:许多面向对象的操作执行得更快。
  • Element-Wise数学操作:许多基于元素的数学运算执行得更快。

在这些领域和其他领域的加速有很多因素,包括改进的MATLAB代码的即时(JIT)编译。重新设计执行引擎也需要重新审视和解决旧的语言缺陷和bug,从而提高质量。这是一个设计可扩展性的引擎的机会,可以促进未来的增强和新特性的出现。

什么是JIT编译?

新的MATLAB执行引擎可以JIT编译所有MATLAB代码,这是它如何更快地执行代码的一个重要因素。像c++这样的编程语言被称为编译语言。c++代码要经过作者发起的编译步骤。此编译步骤生成直接在目标硬件上执行的机器代码。编译器通常可以优化生成的代码,以帮助应用程序更快地执行。

解释型语言由解释器程序一个命令一个命令地执行,不需要显式的编译步骤。对于与数据交互工作的工程师和科学家来说,以这种方式执行命令,改变命令的工作顺序,会非常有帮助。尽管这种执行风格对于探索想法非常有效,但在执行代码块时可能会很慢。

MATLAB通过实时编译MATLAB代码,提供了这两个领域的最佳选择。MATLAB代码被编译,无论是在类、函数、脚本中,还是仅仅在命令行中。没有显式的编译步骤供用户初始化,MATLAB代码可以在小到一行的块中执行。MATLAB JIT编译器生成本机级别的代码,这些代码针对正在执行的MATLAB代码和特定的硬件平台进行了优化。

自2002年发布R13以来,MATLAB就开始使用JIT编译。最初的JIT编译器是作为MATLAB解释器的补充而设计的,并支持该语言的有限子集。金宝app新的执行引擎的设计重点是JIT编译,其中JIT编译是引擎的一个组成部分,能够编译整个MATLAB语言。

例如改善

这个例子说明了新的JIT编译器的优点。它演示了以前的JIT编译器和可以编译所有MATLAB代码的新JIT编译器之间的区别。

这个函数test1调用函数foo1在for循环中,它使用循环变量直接执行计算2.这个函数foo1首先检查它的输入值,并可以使用错误命令,如果输入超出范围。错误配置在本例中不会出现,但是这种输入检查是一种常见的实践,在函数被重用时很有帮助。

函数Test1 x = 0 (1,1e6);x(Ii) = 1;结束结束函数y = foo1 (x)如果(x < 0)错误('x必须是正数');结束y = 2 * x ^ 2 + 3 * x + 4;结束

我记录了以下时间Test1使用时间在我的笔记本上命令[1]:

  • Test1与R2015a: 1.7887秒
  • Test1与R2015b: 0.0435秒

新的执行引擎执行这个示例的速度要快40倍以上!

接下来,考虑一下当我们对测试做一个微小的更改时会发生什么。Test2是一样的Test1除了它调用foo2它通过另一个函数发出可能的错误。

函数Test2 x = 0 (1,1e6);x(Ii) = 1;结束结束函数y = foo2 (x)如果(x < 0) displayError;结束y = 2 * x ^ 2 + 3 * x + 4;结束函数displayError错误('x必须是正数');结束

我记录了以下时间Test2使用时间命令:

  • Test2与R2015a: 3.8667秒
  • Test2与R2015b: 0.0430秒

与R2015aTest2跑起来要花两倍的时间Test1(3.8667秒vs 1.7887秒)。放缓的原因是增加的代码复杂性限制了以前的JIT编译器编译代码的能力。R2015b的执行时间Test1Test2几乎是相同的,演示了新的执行引擎JIT编译所有MATLAB代码的能力。结果是Test2使用R2015b的新执行引擎,执行速度快了近90倍。

提高性能

MATLAB花了一些时间来编译代码。与执行代码的时间相比,编译的时间通常较小。当代码在MATLAB会话中重复运行而不被清除时,您将获得最大的好处,因为代码只需要编译一次。重复运行代码的例子有for循环或重新运行未修改的MATLAB文件。了解这一点后,考虑以下方法来提高代码的性能:

  1. 避免使用清除所有因为它清除编译的代码。使用清晰的相反,当你想要清理你的数据,避免再次引起MATLAB花费的编译时间。
  2. 将代码模块化成多个文件,这样在进行编辑时,就可以减少下次运行时重新编译的代码量。将代码模块化为独立的函数和类还可以帮助提高代码的可读性、可重用性和可维护性。

结果

我们收集并测试了76个性能敏感的用户应用程序,以评估新引擎的性能。测试的程序大小从几十行代码到数百行代码不等,涵盖了从设备模拟到财务等应用程序。下面的柱状图显示了在MATLAB 15b中运行速度比15a快或慢的应用程序(或测试)的数量。从直方图中你可以看到,有一个强烈的右移,表明更快的性能。使用新的执行引擎后,这些应用程序的平均运行速度提高了40%。超过12个应用程序的运行速度至少是前者的两倍。

你的代码有多快?

通过下载并安装R2015b,用重新设计的MATLAB执行引擎测试代码。一旦开始运行代码,您就可以利用MATLAB执行引擎。有关提高代码性能的技巧,请参见提高性能的技巧.要了解关于评估代码性能的更多信息,请参见衡量项目的性能.并通过留下注释与我们分享您的代码如何在新的执行引擎中执行在这里

有关计时代码的详细讨论,请参阅Loren在Dec的博客文章




发布与MATLAB®R2015b

|
  • 打印
  • 发送电子邮件

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。