Loren谈MATLAB的艺术

将想法转化为MATLAB

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

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

内容

重新设计的执行

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

看看一些客户是如何评价新的执行引擎的:

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

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

我的应用程序——“一维和二维有限体积的热传导和流体流动”——表现明显更好——大约好35%。好工作!”恩里科高贵的
意大利里雅斯特大学工程与建筑系热力学与传热教授

它对您的意义:更好的性能、质量和可扩展性

在设计新的执行引擎时,从一开始就考虑到了性能。以下是一些具体的语言领域得到了最显著的改进:

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

在这些方面和其他方面的加速有很多因素,包括改进的MATLAB代码的即时(JIT)编译。重新设计执行引擎也是重新访问和解决旧语言的缺陷和bug,提高质量的时候。这是一个机会来设计引擎的可扩展性,促进未来的增强和新功能的出现。

什么是JIT编译?

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

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

通过实时编译MATLAB代码,MATLAB提供了两方面的优点。无论是在类、函数、脚本中,还是在命令行中,都可以编译MATLAB代码。没有显式的编译步骤供用户初始化,MATLAB代码可以在小到每次一行的块中执行。MATLAB JIT编译器生成针对正在执行的MATLAB代码和特定硬件平台进行优化的本机级代码。

MATLAB从2002年R13版本开始使用JIT编译。最初的JIT编译器被设计为MATLAB解释器的补充,并且支持该语言的有限子集。万博1manbetx新的执行引擎的设计重点是JIT编译,其中JIT编译是引擎的一个组成部分,能够编译整个MATLAB语言。

例如改善

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

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

函数Test1 x = 0 (1,1e6);Ii = 1:1e6 x(Ii) = foo1(Ii);结束结束函数Y = foo1(x)如果(x < 0)错误(“x一定是正的”);结束Y = 2*x.^2+3*x+4;结束

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

  • Test1R2015a: 1.7887秒
  • Test1R2015b: 0.0435秒

新的执行引擎执行这个示例的速度快了40多倍!

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

函数Test2 x = 0 (1,1e6);Ii = 1:1e6 x(Ii) = foo2(Ii);结束结束函数Y = foo2(x)如果(x < 0) displayError;结束Y = 2*x.^2+3*x+4;结束函数displayError错误(“x一定是正的”);结束

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

  • Test2R2015a: 3.8667秒
  • Test2R2015b: 0.0430秒

与R2015aTest2要花两倍的时间Test1(3.8667秒vs 1.7887秒)。减速的原因是增加的代码复杂性限制了以前的JIT编译器编译代码的能力。R2015b的执行时间Test1而且Test2几乎是一样的,展示了新的执行引擎JIT编译所有MATLAB代码的能力。结果是Test2使用R2015b中的新执行引擎,执行速度快了近90倍。

提高性能

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

  1. 避免使用清除所有因为它会清除编译后的代码。使用清晰的相反,当你只是想清除数据,避免重新招致MATLAB编译的时间。
  2. 将代码模块化到多个文件中,这样在进行编辑时,就可以减少下次运行时重新编译的代码量。将代码模块化为独立的函数和类也有助于提高代码的可读性、可重用性和可维护性。

结果

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

你的代码有多快?

通过下载和安装R2015b,用重新设计的MATLAB执行引擎测试代码。一旦开始运行代码,您就可以利用MATLAB执行引擎了。有关改进代码性能的提示,请参见提高性能的技术.要了解有关评估代码性能的更多信息,请参见测量程序的性能.并通过留言与我们分享您的代码如何使用新的执行引擎执行在这里

有关计时代码的详细讨论,请参见Loren十二月的博客帖子




发布与MATLAB®R2015b

|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。