本文描述了可以用来加速MATLAB的技术®算法和应用程序。涵盖的主题包括:
评估代码性能
采用高效的串行编程实践
使用系统对象
在多核处理器和gpu上执行并行计算
生成C代码
每个部分都侧重于特定技术,描述了底层加速技术,并在最适用时解释。您的编程专业知识,您希望加速的算法类型以及您所提供的硬件可以帮助指导您的选择选择1.
评估代码性能
在修改代码之前,您需要确定将您的努力集成的位置。支持此过程的两个关键工具是代码分析仪和Mat金宝applab Profiler。MATLAB编辑器中的代码分析器检查您的代码是否在写作时。代码分析仪识别潜在的问题,并建议修改以最大化性能和可维护性(图1)。代码分析器报告可以在整个文件夹上运行,使您可以查看单个文档中一组文件的所有代码分析仪建议。
探查器显示代码在何处花费时间。它提供一个报告,总结代码的执行情况,包括所有调用函数的列表、每个函数的调用次数以及每个函数内花费的总时间(图2)。探查器还提供有关每个函数的计时信息,例如哪些代码行使用的处理时间最多。
一旦您确定了瓶颈,您就可以专注于改进那些特定代码段的性能的方法。当您实现优化和技术以加快算法时,Profiler可以帮助您度量改进。
采用高效的串行编程实践
在考虑并行计算,代码生成或其他方法之前,它通常是优化序列代码的序列代码。两个有效的编程技术加速您的MATLAB代码是预分配和向量化.
通过预分配,您可以使用该数组所需的最终大小初始化该数组。预分配可帮助您避免动态调整数组大小,尤其是在代码包含为
和虽然
循环。由于MATLAB中的数组被保持在连续的内存块中,因此反复调整大小阵列通常需要MATLAB来花时间寻找更大的邻接内存块,然后将数组移动到这些块中。通过预分配数组,您可以避免这些不必要的内存操作并提高整体执行时间。
向量化是将代码从使用循环转换为使用矩阵和向量操作的过程。MATLAB使用处理器优化的矩阵和向量计算库。因此,通常可以通过向量化代码来提高性能。
使用更大阵列的矢量化MATLAB计算可能是使用GPU加速的好选择。在这种情况下,为
-loops无法矢量化,您通常可以使用并行为
循环(议案
)或C代码生成来加速算法。有关这些技术的更多详细信息,请参见关于并行计算和从MATLAB生成C代码的章节。
你可以用系统对象™在信号处理和通信领域大量加速MATLAB代码。系统对象是系统工具箱(包括通信系统工具箱)中可用的算法的MATLAB面向对象实现™DSP系统工具箱™.通过使用System对象,将声明(系统对象创建)从系统对象中的算法执行解耦(系统对象创建)。这种解耦导致基于循环的循环的计算,因为它允许您执行一次参数处理和初始化。您可以在循环之外创建和配置系统对象的实例,然后调用循环中的步骤方法以执行它。
DSP系统工具箱和通信系统工具箱中的大多数系统对象都实现为MATLAB可执行文件(MEX文件).这种实现可以加速模拟,因为在对象的MEX实现中包含了许多算法优化。有关mex文件的更多细节,请参阅从MATLAB生成C代码一节。
执行并行计算
到目前为止所描述的技术都集中在优化串行MATLAB代码的方法上。您还可以通过使用额外的计算能力来提高性能。MATLAB并行计算产品提供的计算技术可以让您利用多下载188bet金宝搏核处理器、计算机集群和gpu。
在多核处理器和集群上使用MATLAB Workers
并行计算工具箱™允许您在桌面多核计算机上运行多个MATLAB Worker(MATLAB计算引擎)。通过将计算划分到这些工作区,可以加快应用程序的速度。与MATLAB中内置的多线程相比,这种方法可以更好地控制并行性。它通常用于粗粒度问题,如参数扫描和蒙特卡罗模拟。为了提高速度,可以使用MATLAB并行服务器将使用MATLAB workers的并行应用程序扩展到计算机集群或云™.
几个工具箱,包括优化工具箱™统计学和机器学习工具箱™,提供可以利用多工作并行性来加速计算的算法2.在大多数情况下,只需打开一个选项就可以使用并行算法。例如,跑步粉刺
在并行优化工具箱中,你将“UseParallel”选项设置为“always”。
并行计算工具箱提供高级编程结构,例如议案
. 使用议案
你可以加速为
-通过划分循环迭代,在多个MATLAB工作者之间同时执行循环,从而在MATLAB代码中实现循环(图3)。
使用议案
,循环迭代必须是独立的,不依赖于任何其他迭代。要加速依赖或基于状态的循环,可以重新排序计算,使循环成为顺序无关的。或者,也可以并行化包含为
-如果这些选项不可行,则优化为
- 播充或考虑生成C代码。
通过在客户端和MATLAB工作人员之间传输数据议案
循环,你会产生通讯成本。这意味着使用它可能没有任何好处议案
当您只有少数简单计算时。如果是这种情况,请重点关注并行化外部为
-包含更简单的为
循环。
这批处理
命令可用于在MATLAB工作者之间分发独立的计算集,以便作为批作业进行脱机处理。当这些计算需要很长时间运行,而您需要释放桌面MATLAB进行其他工作时,这种方法特别有用。
使用gpu
最初用于加速图形渲染,图形进度单位(GPU)也可以应用于信号处理,计算金融,能源生产和其他领域的科学计算。
您可以直接从MATLAB在NVIDIA gpu上执行计算。FFT、IFFT和线性代数运算是100多个可以直接在GPU上执行的内置MATLAB函数之一。这些重载函数可以在GPU或CPU上操作,具体取决于传递给它们的参数的数据类型。当给定GPUArray(一种由并行计算工具箱提供的特殊数组类型)的输入参数时,这些函数将自动在GPU上运行(图4)。几个工具箱,包括通信系统工具箱和信号处理工具箱™,还提供GPU加速算法。
两项拇指规则将确保您的计算密集型问题适合GPU。首先,当所有核心都忙碌时,您将看到GPU上的最佳性能,利用GPU的固有并行性质。使用在较大的数组上使用矢量化MATLAB计算的代码和支持GPU的工具箱功能适合此类别。其次,应用程序在GPU上运行所需的时间应显着超过在应用程序执行期间在CPU和GPU之间传输数据所需的时间。
对于更高级的GPU使用,如果您熟悉CUDA编程,可以直接从MATLAB运行现有的基于CUDA的GPU内核。然后,您可以使用MATLAB中的数据分析和可视化功能,同时对GPU算法进行更直接的控制。
了解更多信息议案
和批处理
那在多核和多处理器机器上运行MATLAB那基于MATLAB的GPU计算和内置并行和gpu支持算法的工具箱.
从MATLAB代码生成C代码
用自动生成的MATLAB可执行文件(MEX-函数)替换MATLAB代码的部分可能会产生加速。使用MATLAB编码器™,您可以生成可读且可移植的C代码,并将其编译为MEX函数,该函数将替换MATLAB算法的等效部分(图5)。您还可以通过从生成MEX函数来利用多核处理器议案
构造。
实现的加速度取决于算法的性质。确定加速度的最好方法是使用MATLAB Coder生成一个mex函数,并直接测试加速。如果算法包含单精度数据类型、定点数据类型、带有状态的循环或无法向量化的代码,则很可能会看到提速。另一方面,如果你的算法包含MATLAB隐式多线程计算,比如快速傅里叶变换
和SVD.
例如,调用IPP或BLAS库的函数,为在MATLAB中PC上执行而优化的函数,如fft,或可以向量化代码的算法,提速的可能性较小。MATLAB编码器,遵循最佳实践对于C代码生成,请咨询MathWorks技术专家,以找到使用此方法加速算法的最佳方法。
大部分Matlab语言和几个工具箱支持代码生成。金宝appMATLAB编码器提供自动化工具,以帮助您评估算法的代码生成准备情况,并指导您完成C代码生成的步骤(图6)。
了解更多关于从MATLAB到C代码以及如何快速入门MATLAB编码器.
可能的性能收益
您可以通过编写高效的算法、并行处理和代码生成来加速MATLAB应用程序。每种方法都有一个可能的加速范围,这取决于问题和您使用的硬件。这里列出的基准和加速度示例给出了可能的加速度的大致概念。