技术文章和通讯

加速MATLAB算法及其应用

作者:莎拉·韦特·扎拉内克、比尔·周、高拉夫·夏尔马和胡曼·扎林库布


本文描述了可以用来加速MATLAB的技术®算法和应用。涵盖的主题包括:

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

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

评估代码性能

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

图1.MATLAB代码分析器显示了改进性能的建议代码更改。

探查器显示代码在何处花费时间。它提供一个报告,总结代码的执行情况,包括所有调用函数的列表、每个函数的调用次数以及每个函数内花费的总时间(图2)。探查器还提供有关每个函数的计时信息,例如哪些代码行使用的处理时间最多。

图2。探查器摘要报告。

一旦确定了瓶颈,就可以集中精力改进这些特定代码部分的性能。当您实施优化和技术来加速算法时,探查器可以帮助您衡量改进情况。

采用高效的串行编程实践

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

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

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

使用较大阵列的矢量化MATLAB计算可能是使用GPU加速的良好候选。如果对于-循环无法矢量化,通常可以使用并行对于-环路(帕弗)或C代码生成来加速算法。有关这些技术的更多详细信息,请参见关于并行计算和从MATLAB生成C代码的章节。

了解更多关于轮廓,预分配,矢量化其他系列技术提高绩效。

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

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

DSP系统工具箱和通信系统工具箱中的大多数系统对象都实现为MATLAB可执行文件(MEX文件)。由于对象的MEX实现中包含许多算法优化,因此此实现可以加快模拟速度。有关MEX文件的更多详细信息,请参见“从MATLAB生成C代码”一节。

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

执行并行计算

到目前为止,所描述的技术主要集中在优化串行MATLAB代码的方法上。您还可以通过使用额外的计算能力来提高性能。MATLAB并行计算产品提供的计算技术使您能够利用多核处理器、计算机集群和GPU。s manbetx 845

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

并行计算工具箱允许您在桌面多核计算机上运行多个MATLAB Worker(MATLAB计算引擎)。通过将计算划分到这些工作区,可以加快应用程序的速度。与MATLAB中内置的多线程相比,这种方法可以更好地控制并行性。它通常用于粗粒度问题,如参数扫描和蒙特卡罗模拟。为了提高速度,可以使用MATLAB并行服务器将使用MATLAB workers的并行应用程序扩展到计算机集群或云.

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

并行计算工具箱提供高级编程结构,如帕弗. 使用帕弗你可以加速对于-通过划分循环迭代,在多个MATLAB工作者之间同时执行循环,从而在MATLAB代码中实现循环(图3)。

图3。在多核计算机上分布在多个MATLAB工作人员之间的parfor循环迭代。

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

通过在客户端和MATLAB工作人员之间传输数据帕弗循环,则会产生通信成本。这意味着使用帕弗当你只有少量的简单计算时。如果是这样的话,就把重点放在并行化外部对于-包含更简单的对于-循环。

这个一批命令可用于将独立的计算集分布到MATLAB工作人员中,以作为批处理作业进行脱机处理。当这些计算需要很长时间才能运行,并且您需要将桌面MATLAB释放出来进行其他工作时,这种方法特别有用。

使用GPU

最初用于加速图形绘制的图形处理单元(GPU)也可以应用于信号处理、计算金融、能源生产和其他领域的科学计算。

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

图4.串行代码(左)和使用GPU重载函数转换为在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函数来利用多核处理器帕弗构造。

图5。用于生成MEX函数的MATLAB编码器菜单。

获得的加速度取决于算法的性质。确定加速度的最佳方法是使用MATLAB编码器生成MEX函数,并直接测试加速比。如果您的算法包含单精度数据类型、定点数据类型、状态循环或无法矢量化的代码,则可能会看到加速。另一方面,如果您的算法包含MATLAB隐式多线程计算,例如快速傅里叶变换svd,调用IPP或BLAS库的函数,为在PC(如FFTs)上的MATLAB中执行而优化的函数,或可对代码进行矢量化的算法,加速的可能性较小。试试MATLAB编码器,遵循最佳实践对于C代码生成,请咨询MathWorks技术专家,以找到使用此方法加速算法的最佳方法。

许多MATLAB语言和几个工具箱都支持代码生成。MATLAB Coder提供了自动化工具,帮助您评估万博1manbetx算法的代码生成准备情况,并指导您完成生成C代码的步骤(图6)。

图6。MATLAB工具,用于评估代码生成准备情况,并指导您开始生成C代码。

可能的性能增益

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

了解更多关于使用帕弗,不同类型的受支持GPU功能万博1manbetx,对系统对象的内置GPU支持万博1manbetxC代码生成.

组合技术

通过结合本文中描述的方法,通常可以实现额外的加速。例如帕弗-循环可以调用基于C的MEX函数,许多系统对象都支持代码生成,矢量化的MATLAB代码可以在GPU上运行。万博1manbetx

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

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

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

2013年出版-92091v00