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