加快MATLAB算法和应用

莎拉等待Zaranek,比尔周杰伦,拉夫·夏尔马和Houman Zarrinkoub,MathWorks公司

本文介绍的技术,你可以用它来加速你的MATLAB®算法和应用。涵盖的主题包括:

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

每一节都集中在一个特定的技术,介绍了底层加速技术,当它是最适用的解释。你的编程技能,你想加速算法的类型和硬件,你可以有可以帮助指导您的技术选择1

评估代码性能

修改代码之前,你需要确定哪些地方需要集中你的努力。支持这一进程的两个关键工具是代码分析器和MA万博1manbetxTLAB探查。该代码分析器在MATLAB编辑器会检查你的代码,而你正在写它。的代码分析器识别潜在的问题,并建议修改以最大化性能和可维护性(图1)。代码分析器报告可以在整个文件夹中运行,使您可以查看单个文件中的一组文件中的所有代码分析器建议。

图1. MATLAB代码分析器表示推荐代码改变以改进性能。

Profiler将显示你的代码将时间花在。它提供了一个报告,总结你的代码的执行,其中包括所谓的所有功能的列表,每个函数被调用的次数,并且每个功能(图2)中所花费的总时间。探查还提供关于每个功能,如其中的代码行用最处理时间的时序信息。

图2.探查总结报告。

一旦你已经确定了瓶颈,您可以重点关注如何提高代码的特定部分的性能。当你实现优化和技术,加快你的算法,探查可以帮你测量的改善。

采取有效串行编程实践

它往往是考虑并行计算,代码生成,或其他方法之前,优化性能串行代码一个很好的做法。两种有效的编程技术,加速您的MATLAB代码是预分配矢量

随着预分配,您可以使用该阵列所需的最终大小初始化数组。预分配可帮助您避免动态调整阵列,特别是当代码包含对于循环。由于在MATLAB阵列在存储器的连续块被保持,反复调整阵列通常需要MATLAB花费时间去寻找的存储器更大的连续块,然后移动所述阵列分成那些块。通过预先分配数组,就可以避免这些不必要的内存操作,提高整体执行时间。

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

使用更大的阵列量化MATLAB计算可能使用GPU加速的良好候选。在情况下,对于-loops无法矢量化,你可以经常使用并行对于-loop(PARFOR)或C代码产生以加速算法。见来自MATLAB并行计算和生成的C代码的章节有关这些技术的更多细节。

学习更多关于剖析预分配矢量其它串行技术以提高性能。

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

您可以使用系统对象加快主要是在信号处理和通信领域的MATLAB代码。系统对象的算法MATLAB面向对象的实现在系统工具箱可用的,包括通信系统工具箱和DSP系统工具箱。通过使用系统对象,你去耦声明(系统对象的创建)从算法的执行在系统对象中找到。更高效的循环为基础计算的这种脱钩的结果,因为它可以让你进行参数处理和初始化一次。您可以创建和配置外循环的系统对象的实例,然后调用内循环步骤的方法来执行它。

在DSP系统工具箱和通信系统工具箱大多数系统对象被实现为MATLAB可执行文件(MEX-文件)。这个实现可以加快仿真,因为许多算法最优化包括在对象的MEX实现。查看从MATLAB生成C代码,以便在MEX-文件的更多细节部分。

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

执行并行计算

描述的技术,到目前为止都集中在如何优化串行MATLAB代码。您还可以使用额外的计算能力获得的性能提升。MATLAB并行计算产品提供计算可以让你利用多核处理s manbetx 845器,计算机集群和GPU的优势技术。

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

并行计算工具箱让您在桌面多核机器上运行多个MATLAB工人(MATLAB计算引擎)。您可以通过在这些工人将计算应用程序的速度。这种方法给你更多的控制权比并行使用内置在MATLAB多线程找到。它经常被用于粗粒度问题,如参数扫描和Monte Carlo模拟。对于更大的加速比,并行应用程序,使用MATLAB工人可以扩展到计算机集群或云使用MATLAB并行服务器

一些工具箱,包括优化工具箱统计和机器学习工具箱,提供了可以利用multiworker并行加速计算的算法2。在大多数情况下,你可以通过简单的一个选项打开使用并行算法。例如,要运行fmincon在优化工具箱在平行设置的“UseParallel”选项设置为“总是”。

并行计算工具箱提供了高层次的编程结构,如PARFOR。运用PARFOR你可以加速对于通过将循环迭代跨越几个MATLAB工人同时执行(图3)在MATLAB代码-loops。

图3. PARFOR-循环迭代跨越多个MATLAB分布式工人在多核计算机上。

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

通过为客户端和MATLAB工人之间传输数据PARFOR循环,您所发生的通信费用。这意味着,有可能是没有优势,使用PARFOR当你只有少量的简单计算。如果是这样的情况下,而不是集中在并行的外对于-loop包含简单对于-环。

批量命令可以用来作为批处理作业分发组独立的跨MATLAB工人的计算进行离线处理。当这些计算需要较长的时间来运行,你需要释放你的桌面MATLAB进行其他工作,这种做法尤其有用。

使用的GPU

原本用于加速图形渲染,图形进展单元(GPU),也可应用于信号处理科学计算,计算金融,能源生产等领域。

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

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

拇指的两个规则将确保您的计算密集型的问题是一个非常适合的GPU。首先,你会看到在GPU上的最佳性能,当所有的核心始终处于忙碌状态,利用GPU的并行固有的性质。代码,使用矢量的更大的阵列,并启用了GPU的工具箱功能就是这一类MATLAB计算。其次,对于应用程序在GPU上运行所需要的时间应该是显著多于应用程序执行过程中所需的CPU和GPU之间传送数据的时间。

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

了解更多关于使用PARFOR批量在多核和多处理器机器上运行MATLABGPU与MATLAB计算用工具箱内置并行和启用GPU的算法

从MATLAB代码生成C代码

使用自动生成的MATLAB可执行文件(MEX函数)替换的您的MATLAB代码部分可能会产生加速比。使用MATLAB编码器,可以生成可读和可移植的C代码,并将其编译成MEX-函数替换您的MATLAB算法(图5)的等效部分。您还可以充分利用多核处理器的通过产生MEX-功能PARFOR结构体。

图5. MATLAB编码器菜单用于生成MEX-功能。

实现加速的量取决于算法的性质。以确定加速度的最好方法是为使用MATLAB编码器一个MEX-功能和测试的加速比第一手。如果你的算法包含单精度数据类型,定点数据类型,与各国的循环,或代码不能向量化,你可能会看到速度提升。在另一方面,如果你的算法包含MATLAB含蓄的多线程计算,如FFTSVD,调用IPP或BLAS库,在MATLAB执行优化的PC上的功能,如快速傅里叶变换,或算法在这里可以向量化的代码,加速比功能的可能性较小。尝试MATLAB编码器,遵循最佳做法对于C代码生成,并咨询MathWorks公司的技术专家找到这种方法加速你的算法的最佳方法。

大部分的MATLAB语言和几个工具箱支持代码生成。万博1manbetxMATLAB编码器提供自动化工具来帮助您评估算法的代码生成准备和引导您完成步骤C代码生成(图6)。

图6. MATLAB工具用于评估代码生成准备和引导你开始生成C代码。

可能的性能提升

您可以通过编写高效的算法,并行处理和代码生成加速您的MATLAB应用程序。每种方法都有一系列可能的加速,这取决于这个问题,您正在使用的硬件。基准和这里列出加速例子给出了可能的加速度的总体思路。

学习更多关于使用性能提升PARFOR不同类型的支持GPU功能万博1manbetx内置的系统对象的GPU支持万博1manbetxC代码生成

结合技术

您可以经常通过合并本文中介绍的方法,可以实现额外的加速。例如,PARFOR-loops可以调用基于C-MEX-功能,代码生成被支承用于许多系统对象,和向量化MATLAB代码可以适于在GPU上万博1manbetx运行。

了解更多关于使用多种技术合作,加快模拟通信算法和4G LTE系统的设计。

1这篇文章确实引起内存问题不是盖的性能限制,例如交换或文件I / O。有关这些主题的更多信息,请参阅为有效地利用存储策略数据导入和导出

2当与并行计算工具箱使用。

发布时间2013 - 92091v00