加速MATLAB算法及应用

由Sarah等待Zaranek,Bill Chou,Gaurav Sharma,以及Houman Zarrinkoub,Mathworks


本文介绍了您可以使用的技术来加速MATLAB®算法和应用程序。主题包括:

评估代码性能
采用高效的串行编程实践
使用系统对象
在多核处理器和gpu上执行并行计算
生成C代码

每一节重点介绍一种特定的技术,描述底层的加速技术,并解释何时最适用。您的编程专业知识、希望加速的算法类型以及可用的硬件可以帮助指导您选择技术1

评估代码的性能

在修改代码之前,您需要确定您的工作重点。支持这一过程的两个关键工具是代码分析器和MA金宝appTLAB分析器。在编写代码时,MATLAB编辑器中的代码分析器会检查代码。代码分析器识别潜在的问题,并建议进行修改,以最大限度地提高性能和可维护性(图1)。代码分析器报告可以在整个文件夹上运行,使您能够在单个文档中查看针对一组文件的所有代码分析器建议。

图1. MATLAB代码分析仪显示推荐的代码更改以提高性能。

Profiler显示您的代码在哪里度过它的时间。它提供了一份报告总结了代码执行,包括调用所有函数的列表,调用每个函数的次数,以及每个函数内所花费的总时间(图2)。Profiler还提供有关每个功能的时序信息,例如哪条代码线使用最多的处理时间。

图2. Profiler摘要报告。

一旦您确定了瓶颈,您就可以专注于改进那些特定代码段的性能的方法。当您实现优化和技术以加快算法时,Profiler可以帮助您度量改进。

采用高效的串行编程实践

在考虑并行计算、代码生成或其他方法之前,优化串行代码的性能通常是一个很好的实践。有两种有效的编程技术可以加速你的MATLAB代码预先分配向量化

使用preLocation,使用该数组所需的最终大小初始化数组。预架分配可帮助您避免动态调整阵列,特别是当代码包含时尽管循环。由于MATLAB中的数组保存在连续的内存块中,重复调整数组大小通常需要MATLAB花费时间寻找更大的连续内存块,然后将数组移动到这些块中。通过预分配数组,可以避免这些不必要的内存操作,并提高总体执行时间。

向量化是将代码从使用循环转换为使用矩阵和向量操作的过程。MATLAB使用处理器优化的矩阵和向量计算库。因此,通常可以通过向量化代码来提高性能。

使用较大阵列的矢量化MATLAB计算可能是使用GPU加速的良好候选。如果-loops不能被向量化,通常可以使用parallel循环(parfor)或C代码生成,以加速算法。有关这些技术的更多详细信息,请参阅并行计算和生成C代码的部分。

学习更多关于分析预先分配向量化, 和其他系列技术以提高性能。

利用优化算法使用系统对象

您可以使用系统对象在很大程度上在信号处理和通信领域加速MATLAB代码。系统对象是系统工具箱中可用的MATLAB面向对象实现的算法,包括通信系统工具箱DSP系统工具箱.通过使用System对象,可以将声明(System对象创建)与在System对象中找到的算法的执行解耦。这种解耦可以产生更有效的基于循环的计算,因为它只允许执行一次参数处理和初始化。您可以在循环外部创建和配置System对象的实例,然后在循环内部调用step方法来执行它。

DSP系统工具箱和通信系统工具箱中的大多数系统对象都以MATLAB可执行文件实现(mex files).这种实现可以加速模拟,因为在对象的MEX实现中包含了许多算法优化。有关mex文件的更多细节,请参阅从MATLAB生成C代码一节。

学习更多关于使用System对象进行流处理创建自己的系统对象, 和模拟信号处理算法在MATLAB中使用System对象。

执行并行计算

到目前为止所描述的技术都集中在优化串行MATLAB代码的方法上。您还可以通过使用额外的计算能力来提高性能。MATLAB并行计算产品提供的计算技术可以让您利用多下载188bet金宝搏核处理器、计算机集群和gpu。

在多核处理器和集群上使用MATLAB Workers

并行计算工具箱允许您在台式电机上运行多个MATLAB工人(MATLAB计算引擎)。您可以通过划分这些工人的计算来加速您的应用程序。这种方法使您可以更好地控制并行性,而不是在MATLAB中找到的内置多线程。它通常用于粗糙粒度的问题,例如参数扫描和蒙特卡罗模拟。有关使用MATLABPRILLART服务器的更大加速,使用MATLAB工人使用MATLAB工人的并行应用程序可以缩放到计算机群集或云

几个工具箱,包括优化工具箱统计学和机器学习工具箱,提供可以利用多工作并行性来加速计算的算法2.在大多数情况下,只需打开一个选项就可以使用并行算法。例如,跑步fmincon在并行优化工具箱中,你将“UseParallel”选项设置为“always”。

并行计算工具箱提供高级编程结构,例如parfor.使用parfor你可以加速- 通过划分循环迭代来在多个MATLAB工人划分的循环迭代中划分MATLAB代码(图3)。

图3。在多核计算机上分布于多个MATLAB工作者的parfor循环迭代。

使用parfor,循环迭代必须是独立的,不依赖于任何其他迭代。要加速依赖或基于状态的循环,可以重新排序计算,使循环成为顺序无关的。或者,也可以并行化包含循环。如果这些选项不可行,可以优化身体-loop或考虑生成C代码。

通过在客户端和Matlab工人之间传输数据parfor循环,你会产生通讯成本。这意味着使用它可能没有任何好处parfor当你只有少量的简单计算时。如果是这种情况,请将重点放在并行化外部-loop包含更简单的循环。

批处理命令可用于在MATLAB工作者之间分发独立的计算集,以便作为批作业进行脱机处理。当这些计算需要很长时间运行,而您需要释放桌面MATLAB进行其他工作时,这种方法特别有用。

使用gpu

图形处理单元(graphics progressive unit, gpu)最初用于加速图形渲染,也可应用于信号处理、计算金融、能源生产等领域的科学计算。

您可以直接从MATLAB在NVIDIA gpu上执行计算。FFT、IFFT和线性代数运算是100多个可以直接在GPU上执行的内置MATLAB函数之一。这些重载函数可以在GPU或CPU上操作,具体取决于传递给它们的参数的数据类型。当给定GPUArray(一种由并行计算工具箱提供的特殊数组类型)的输入参数时,这些函数将自动在GPU上运行(图4)。几个工具箱,包括通信系统工具箱和信号处理工具箱,还提供GPU加速算法。

图4.使用过载的GPUArrays的函数,转换为在GPU(右)上运行的序列代码(左)和代码。

两个经验法则将确保您的计算密集型问题是一个很好的适合GPU。首先,当所有的内核都处于忙碌状态时,利用GPU固有的并行特性,你会看到GPU的最佳性能。在更大的数组和支持gpu的工具箱函数上使用向量化MATLAB计算的代码就属于这一类。其次,应用程序在GPU上运行所需的时间应该远远超过应用程序执行期间在CPU和GPU之间传输数据所需的时间。

为了更高级使用GPU,如果您熟悉CUDA编程,您可以直接从MATLAB运行基于CUDA的GPU内核。然后,您可以使用MATLAB中的数据分析和可视化功能,同时更直接控制GPU算法。

了解更多有关使用parfor批处理在多核和多处理器机器上运行MATLABGPU与MATLAB计算, 和内置并行和gpu支持算法的工具箱

从MATLAB代码生成C代码

用自动生成的MATLAB可执行文件(MEX-function)替换部分MATLAB代码可以提高速度。使用MATLAB编码器,您可以生成可读和便携式的C代码并将其编译成MEX函数,替换MATLAB算法的等效部分(图5)。您还可以通过生成MEX函数来利用多核处理器parfor结构体。

图5。MATLAB编码器菜单生成的一个mex函数。

实现的加速度取决于算法的性质。确定加速度的最好方法是使用MATLAB Coder生成一个mex函数,并直接测试加速。如果算法包含单精度数据类型、定点数据类型、带有状态的循环或无法向量化的代码,则很可能会看到提速。另一方面,如果你的算法包含MATLAB隐式多线程计算,比如FFT.圣言会例如,调用IPP或BLAS库的函数,为在MATLAB中PC上执行而优化的函数,如fft,或可以向量化代码的算法,提速的可能性较小。MATLAB编码器,遵循最佳实践对于C代码生成,并咨询MathWorks技术专家来找到通过这种方法加速算法的最佳方法。

很多MATLAB语言和一些工具箱都支持代码生成。金宝appMATLAB Coder提供了自动工具来帮助您评估算法的代码生成准备情况,并指导您完成c代码生成的步骤(图6)。

图6。用于评估代码生成准备和指导您开始生成C代码的MATLAB工具。

学习更多关于从MATLAB到C代码以及如何快速入门MATLAB编码器

可能的性能提升

您可以通过编写高效的算法、并行处理和代码生成来加速MATLAB应用程序。根据问题和所使用的硬件,每种方法都有一系列可能的加速。这里列出的基准测试和加速示例给出了可能的加速的一般概念。

学习更多关于性能获得使用parfor支持不同类型的GPU功能金宝app对系统对象的内置GPU支持金宝app, 和c代码生成

结合技术

通过组合本文中描述的方法,您通常可以获得额外的加速。例如,parfor-循环可以调用基于C的MEX函数,许多系统对象都支持代码生成,矢量化的MATLAB代码可以在GPU上运行。金宝app

了解更多关于一起使用多种技术来加速的模拟通信算法以及4G LTE系统的设计。

1本文不会涵盖由诸如交换或文件I / O等内存问题引起的性能限制。有关这些主题的更多信息,请参阅有效利用记忆的策略数据导入和导出

2与并行计算工具箱一起使用时。

发布于2013年- 92091v00