技术文章及通讯

加速MATLAB算法及应用

作者:Sarah Wait Zaranek, Bill Chou, Gaurav Sharma和Houman zarrinkub, MathWorks


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

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

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

评估代码性能

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

图1。MATLAB代码分析器显示建议的代码更改,以提高性能。
图1。MATLAB代码分析器显示建议的代码更改,以提高性能。

分析器显示了代码花费时间的地方。它提供了一个总结代码执行情况的报告,包括所有被调用函数的列表,每个函数被调用的次数,以及每个函数所花费的总时间(图2)。Profiler还提供了关于每个函数的计时信息,比如哪行代码使用了最多的处理时间。

图2。侧写总结报告。
图2。侧写总结报告。

一旦确定了瓶颈,就可以专注于提高这些特定代码部分的性能的方法。当您实现优化和技术来加速算法时,分析器可以帮助您衡量改进。

采用有效的串行编程实践

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

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

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

使用较大数组的矢量化MATLAB计算可能是使用GPU加速的良好候选者。在以下情况下-loops不能向量化,您通常可以使用并行循环(parfor)或c代码生成来加速算法。有关这些技术的更多细节,请参阅并行计算和从MATLAB生成C代码的部分。

了解更多分析预先配置向量化,其他系列技术提高性能。

利用系统对象优化算法

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

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

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

执行并行计算

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

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

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

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

并行计算工具箱提供了高级编程结构,例如parfor.使用parfor你可以加速通过划分循环迭代,在多个MATLAB工作者之间同时执行(图3)。

图3。在多核计算机上分布在多个MATLAB worker上的parfor-loop迭代。
图3。在多核计算机上分布在多个MATLAB worker上的parfor-loop迭代。

使用parfor,循环迭代必须是独立的,不依赖于任何其他迭代。要加速依赖循环或基于状态的循环,可以重新排序计算,使循环变得与顺序无关。对象的外部循环也可以并行化循环。如果这些选择都不可行,要么优化车身-loop或考虑生成C代码代替。

通过在客户端和MATLAB工作者之间传输数据parfor循环,你会产生通信成本。这意味着使用它可能没有任何优势parfor当你只有少量的简单计算时。如果是这种情况,则将重点放在并行化外部对象上包含更简单的循环。

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

使用gpu

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

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

图4。串行代码和使用GPU阵列的重载函数转换为在GPU上运行的代码。
图4。串行代码(左)和转换为运行在GPU上的代码(右)使用GPU阵列的重载函数。

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

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

了解更多关于使用parfor而且批处理在多核和多处理器机器上运行MATLAB基于MATLAB的GPU计算,带有内置并行和gpu算法的工具箱

从MATLAB代码生成C代码

用自动生成的MATLAB可执行文件(MEX-function)替换部分MATLAB代码可能会提高速度。使用MATLAB编码器,您可以生成可读且可移植的C代码,并将其编译为一个mex -函数,以取代MATLAB算法的等效部分(图5)。您还可以通过从生成mex -函数来利用多核处理器parfor构造。

图5。MATLAB编码器菜单生成一个MEX函数。
图5。MATLAB编码器菜单,用于生成一个mex函数。

实现的加速量取决于算法的性质。确定加速度的最佳方法是使用MATLAB Coder生成一个mex函数,并测试加速的第一手资料。如果您的算法包含单精度数据类型、定点数据类型、带状态的循环或不能向量化的代码,则可能会看到加速。另一方面,如果您的算法包含MATLAB的隐式多线程计算,如fft而且圣言会例如,调用IPP或BLAS库的函数,为在PC上的MATLAB中执行而优化的函数(如fft),或者可以向量化代码的算法,这些都不太可能加速。试试MATLAB编码器,遵循最佳实践用于c代码生成,并咨询MathWorks技术专家,以找到使用这种方法加速算法的最佳方法。

大部分MATLAB语言和一些工具箱都支持代码生成。万博1manbetxMATLAB Coder提供自动化工具来帮助您评估算法的代码生成就绪性,并指导您完成c代码生成的步骤(图6)。

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

可能的性能提升

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

了解更多使用parfor支持不同类型的GPU功能万博1manbetx内置GPU支持系统对象万博1manbetx,c代码生成

结合技术

您通常可以通过结合本文中描述的方法来实现额外的加速。例如,parfor-loops可以调用基于c的mexo函数,支持许多System对象的代码生成,向量化的MATLAB代码可以适应在GP万博1manbetxU上运行。

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

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

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

发布日期:2013 - 92091v00