主要内容

dspunfold

对象生成一个多线程MEX文件MATLAB函数

描述

dspunfold文件从入口点MATLAB生成一个多线程MEX文件®函数由文件,使用展开技术。展开是一种通过并行化来提高吞吐量的技术。多线程MEX文件利用了主机的多核CPU架构,可以显著提高速度。除了多线程MEX文件外,该函数还生成一个单线程MEX文件、一个自诊断分析器函数和相应的帮助文件。

dspunfold选项文件从指定的入口点MATLAB函数生成多线程MEX文件文件,使用指定的函数参数选项

请注意

此函数需要一个MATLAB编码器™许可证。

输入参数

全部折叠

选项

描述

例子

args参数

单元阵列

作为单元格数组指定的入口点MATLAB函数的参数类型。

单元格数组接受数字元素coder.typeof函数,以及编码器。常数函数。

所生成的多线程MEX文件针对的大小、类和复杂性进行了特殊化参数

单元格数组中的元素数量必须与入口点MATLAB函数所期望的参数数量相同。

  • dspspread FCN -args {ones(10,1), 5}

    dspunfold类中的元素提取类型(大小、类和复杂性)信息参数单元阵列。

    fcn为MATLAB的入口点函数。

  • dsp展开FCN -args {code .typeof(ones(10,1)), code .typeof(5)}

    coder.typeof的类型fcn参数。

  • dspspread fcn -args {code . constant (ones(10,1)), code . constant (5)}

  • dsp展开FCN -args {}

    默认情况下,参数{}.空单元格数组{}表明fcn不接受输入参数。

- o输出

特征向量

输出多线程MEX文件的名称,指定为字符向量。如果没有输出,则生成的多线程MEX文件的名称继承自输入MATLAB函数“_mt”后缀。dspunfold还向此名称添加特定于平台的扩展。此外,dspunfold生成一个单线程的MEX文件“_st”后缀和带有“_analyzer”后缀。

  • 没有输出指定名称

    dspunfold fcn

    文件生成:fcn_mt.mexw64fcn_st.mexw64fcn_analyzer.p

  • 输出指定名称

    dsp展开FCN -o foo

    文件生成:foo.mexw64foo_st.mexw64foo_analyzer.p

- s statelength

大于或等于零的标量整数

汽车

算法的状态长度在MATLAB函数的入口点,指定为大于或等于零的标量整数,或汽车.默认情况下,statelength帧,表示该算法是无状态的。

如果至少有一个条目frameinputs真正的statelength在样本中考虑。

有关框架和示例的信息,请参见基于样本和框架的概念

- s汽车触发自动状态长度检测。在此模式下,必须为参数单元阵列。这些输入检测算法的状态长度。你可以输入编码器。常数但不是coder.typeof.调用自动状态长度检测时,建议向参数数组中。看到状态长度自动检测

  • dspspread FCN -args {randn(10,1), randn(10,1), randn(10,1)} -s 3 -f [false, false, false]

    状态长度为三个帧。

  • dspspread FCN -args {randn(10,1), randn(10,1), randn(10,1)} -s 3 -f [true, false, false]

    状态长度为三个样本。在样本中考虑状态长度,因为至少有一个条目- f选择是真正的

  • dsp展开FCN -args {randn(10,1), randn(10,1), randn(10,1)} -s auto

    自动状态长度检测被调用。

  • dspspread FCN -args{编码器。Typeof (randn(10,1)), code . Typeof (randn(10,1)), code . Typeof (randn(10,1))} -s auto生成以下错误信息:输入参数1的类型是coder。PrimitiveType,当使用-s auto时不支万博1manbetx持

- f frameinputs

标量的逻辑

逻辑值向量

帧状态输入参数为MATLAB函数的入口点,指定为之一真正的

  • 真正的-输入以帧为单位,可以在不改变系统行为的情况下细分为样本。

  • 输入不能在不改变系统行为的情况下被细分为样本。例如,不能在不改变过滤器特性的情况下细分过滤器的系数。

默认情况下,frameinputs

frameinputs设置为标量逻辑值将同时设置所有输入的帧状态。

指定statelength在样本中,至少设置一个条目frameinputs真正的

如果frameinputs未指定,单位为statelength是帧。

  • dspspread FCN -args {randn(10,1), randn(10,1), randn(10,1)} -s 3 -f true

    所有的输入都被标记为帧。状态长度为三个样本。

  • dspspread FCN -args {randn(10,1), randn(10,1), randn(10,1)} -s 3 -f [true, false, false]

    状态长度为三个样本。

  • dspspread FCN -args {randn(10,1), randn(10,1), randn(10,1)} -s 3

    的默认值frameinputs.状态长度为三个帧。

- r重复

正整数

用于生成多线程MEX文件的重复因子,指定为正整数。的默认值重复1.看到重复的因素

dsp展开FCN -args {randn(10,2), randn(20,2), randn(30,3)} -r 2

- t线程

正整数

多线程MEX文件使用的线程数,指定为正整数。的默认值线程是当前机器上的物理CPU核数。看到线程

dspspread FCN -args {randn(10,1), randn(20,2), randn(30,3)} -t 4 . dspspread FCN -args {randn(10,1), randn(20,2), randn(30,3)

- v详细

标量的逻辑

选项,在代码生成期间显示详细输出,指定为真正的.默认为真正的

  • dsp展开FCN -args {randn(10,1), randn(20,2), randn(30,3)} -v true

  • dspspread FCN -args {randn(10,1), randn(20,2), randn(30,3)} -v false

MATLAB函数的入口dspunfold生成多线程的MEX文件。函数必须支持代码生成。万博1manbetx

例子:dspspread FCN -args {randn(10,1),randn(10,2),randn(20,1)}

fcn是MATLAB函数的入口点1) {randn(10日,randn (10, 2), randn(20日1)}是它的输入参数。

输出文件

当你调用dspunfold在MATLAB函数的入口点上,dspunfold生成以下文件。

文件

价值

描述

例子

多线程MEX文件

墨西哥人文件

多线程MEX文件生成的入口点MATLAB函数。MEX文件继承输出的名字。如果没有输出如果指定了。name,则该文件的名称继承自MATLAB函数“_mt”后缀。还将向名称中添加特定于平台的扩展。

  • dsp展开FCN -o foo生成foo.mexw64

  • dspunfold fcn生成fcn_mt.mexw64

用于多线程MEX文件的帮助文件

MATLAB文件

MATLAB帮助文件的多线程MEX文件。帮助文件与MEX文件具有相同的名称,但是带有'。米的扩展。要调用帮助文件,键入help 在MATLAB命令提示符。

此帮助文件显示有关如何调用MEX文件、其语法、延迟,以及输入到MEX文件的类型(大小、类和复杂性)。此外,帮助文件记录使用的参数dspunfold- - - - - -线程重复,国家长.在调用MEX文件时,此信息非常有用。调用MEX文件的语法应该与帮助文件中显示的语法相同。

  • 帮助foo

  • 帮助fcn_mt

单线程MEX文件

墨西哥人文件

单线程生成的MEX文件的入口点MATLAB函数。MEX文件继承输出名称带有“_st”后缀。如果没有输出如果指定了。name,则该文件的名称继承自MATLAB函数“_st”后缀。还将向名称中添加特定于平台的扩展。使用此文件作为基准,与多线程MEX文件的速度进行比较。

  • dsp展开FCN -o foo生成foo_st.mexw64

  • dspunfold fcn生成fcn_st.mexw64

帮助文件用于单线程MEX文件

MATLAB文件

MATLAB帮助文件的单线程MEX文件。帮助文件与MEX文件具有相同的名称,但是带有'。米的扩展。要调用帮助文件,键入help 在MATLAB命令提示符。

帮助文件显示有关如何调用MEX文件、它的语法和MEX文件输入的类型(大小、类和复杂性)的信息。调用MEX文件的语法应该与帮助文件中显示的语法相同。

  • 帮助foo_st

  • 帮助fcn_st

自诊断分析仪功能

p代码文件

Report = function_analyzer (input 1, input 2,…输入n)度量多线程MEX文件和单线程MEX文件之间的速度差异。该文件验证输出值是否匹配。

Report = function_analyzer('latency')报告通过展开引入的多线程MEX文件的延迟。

报告包含以下字段:

  • 延迟——延迟的值(以帧为单位)

  • 加速-多线程MEX文件和单线程MEX文件之间的加速差异。如果你指定了延迟选项时,此字段的值为空[]

  • Pass -逻辑值,显示生成的多线程MEX文件和单线程MEX文件之间的输出是否匹配。如果你指定了延迟选项时,此字段的值为空[]

分析仪输入的第一个维度必须是给定的相应输入的第一个维度的倍数arg游戏选择。其他维度必须完全匹配。

解析器继承输出名称带有“_analyzer”后缀。如果没有输出如果指定了。name,则该文件的名称继承自MATLAB函数“_analyzer”后缀。

  • 沿着第一个维度指定具有不同值的多个帧

    示例1:Report = foo_analyzer(randn(10*2,1), randn(20*2,2), randn(30*3,3)))

    示例2:报告= foo_analyzer ([randn (10,1); randn (10,1)], [randn (20,1); randn (20,1)], [randn(30、1);randn(30、1);randn(30日1)))

  • Report = foo_analyzer('latency')

自诊断分析仪功能的帮助文件

MATLAB文件

自诊断分析仪功能的帮助文件。帮助文件与MEX文件具有相同的名称,但是带有'。米的扩展。要调用帮助文件,键入帮助< function_analyzer >在MATLAB。

自诊断分析器函数的帮助文件显示了有关如何调用分析器函数、分析器函数的语法和分析器函数输入的类型(大小、类和复杂性)的信息。调用分析器函数的语法应该与帮助文件中显示的语法相同。

帮助foo_analyzer

限制

一般的局限性

  • 在Windows和Linux上,必须使用支持Open Multiprocessing (OpenMP)万博1manbetx应用程序接口的编译器。看到万博1manbetx支持编译器

  • 如果你有macOS与一个Xcode版本12.0或更高版本,使用dspunfold函数不支持。万博1manbetx

  • 如果输入MATLAB函数有运行时错误,则在运行多线程MEX文件时不会捕获错误。在使用dspunfold函数,调用codegen在MATLAB函数上,确保MEX文件成功生成。

  • 如果生成的代码使用大量内存来存储局部变量,则大约4MB在Windows平台上,生成的多线程MEX文件可能有意想不到的行为。这个限制因平台而异。作为一种解决方法,减少输入信号的大小或重构MATLAB函数以使用更少的本地内存。

  • dspunfold不支持:万博1manbetx

    • 变长度输入宗量而且varargoutMATLAB函数内部

    • 可变大小的输入和输出

    • 属性的系统对象输入具有任意帧长度的信号DecimationFactor财产。当输入信号的帧长不是抽取因子的倍数时,认为该输入信号具有任意帧长。在这种情况下,生成的代码中对象的输出是一个可变大小的信号,并且dspunfold不支持可变大小的输万博1manbetx出信号。

      在的情况下dsp。FarrowRateConverter对象时,可以使用getRateChangeFactors函数。

    • p编码的入口点MATLAB函数

    • 单元格数组作为输入和输出

分析仪的局限性

类生成的分析器函数适用于以下限制dspunfold函数。有关分析仪功能的更多信息,请参阅的“更多关于”部分中的“自诊断分析仪”dspunfold

  • 如果分析器输入的多个帧相同,分析器可能抛出假阳性通过结果。建议您为分析器的每个输入提供至少两个不同的帧。

  • 如果入口点MATLAB函数中的算法根据输入值选择其状态长度,分析仪可能会提供不同的通过不同输入值的结果。有关示例,请参见FIR_Mean函数为什么分析器选择错误的状态长度?

  • 如果进入点MATLAB函数的输入确实立即影响输出,则分析仪可能抛出假阳性通过结果。有关示例,请参见Input_Output函数为什么分析器选择零状态长度?

  • 如果多线程MEX文件和单线程MEX文件的输出结果在统计上匹配,但在数值上不匹配,则分析器不通过。考虑到FilterNoise函数,它用FIR滤波器对随机噪声信号进行滤波。函数调用randn从内部产生随机噪声。的输出结果FilterNoise函数在统计上匹配,但在数值上不匹配。

    函数输出= FilterNoise(x)持续的FIRFilter如果isempty(FIRFilter) FIRFilter = dsp。FIRFilter (“分子”0.4 fir1 (12));结束输出= FIRFilter(x+randn(1000,1));结束
    运行时,自动状态长度检测工具运行FilterNoise,该工具检测到无限的状态长度。因为该工具无法为有限的状态长度找到数值匹配,所以它选择无限的状态长度。

    dspunfoldFilterNoisearg游戏{randn (1000 1)}- s汽车
    创建单线程MEX文件FilterNoise_st。搜索最小状态长度(这可能需要一段时间)检查不足1…不足检查无限…充分检查2…创建多线程的MEX文件FilterNoise_mt. xml。mexw64警告:由于性能考虑,多线程被禁用。当状态长度大于或等于(Threads-1)*重复帧(在本例中为3帧)时,就会发生这种情况。>在code .internal.warning(第8行)在unfoldingEngine/BuildParallelSolution(第25行)在unfoldingEngine/generate(第207行)在dsp展开(第234行)中创建分析器文件FilterNoise_analyzer

    该算法不需要无限状态。FIR滤波器的状态长度,因此算法为12

    调用dspunfold状态长度设置为12。

    dspunfoldFilterNoisearg游戏{randn (1000 1)}- s12- f真正的
    创建单线程MEX文件FilterNoise_st。mexw64创建多线程MEX文件FilterNoise_mt。mexw64创建分析文件FilterNoise_analyzer

    运行analyzer函数。

    FilterNoise_analyzer (randn (1000 * 4,1))
    分析多线程MEX文件FilterNoise_mt。mexw64……延迟= 8帧加速= 0.5x警告:多线程MEX文件FilterNoise_mt的输出结果。mexw64不匹配单线程MEX文件FilterNoise_st.mexw64的输出结果。在生成多线程MEX文件FilterNoise_mt.mexw64时,检查是否为dsp展开函数提供了正确的状态长度值。有关此问题的最佳实践和可能的解决方案,请参阅dspspread函万博 尤文图斯数参考页中的“Tips”部分。>在code .internal.warning(第8行)在FilterNoise_analyzer ans = Latency: 8 Speedup: 0.4970 Pass: 0

    分析器寻找数字匹配,但验证失败,即使生成的多线程MEX文件是有效的。

加速的局限性

  • 如果入口点MATLAB函数包含低复杂度的代码,则MATLAB开销或多线程MEX开销会掩盖任何性能增益。在这种情况下,不要使用dspunfold

  • 如果输入MATLAB函数中的操作数量与输入或输出数据的大小相比较小,则多线程MEX文件不提供任何加速增益。有时,即使重复值增加,也会导致加速损失。在这种情况下,不要使用dspunfold

更多关于

全部折叠

国家长

算法的状态长度。

大多数时候,使用的状态长度dspunfold匹配入口点MATLAB函数中算法的状态长度。如果算法简单,状态长度很容易确定。例如,FIR滤波器的状态长度是滤波器中的抽点数1.在某些情况下,为了优化加速,dspunfold属性指定的状态长度与算法状态长度或状态长度不同- s选择。例如,当状态长度大于(线程- 1重复框架,dspunfold认为状态长度是无限的。此外,由于性能考虑,多线程被禁用。

状态长度自动检测

您可以自动检测多线程MEX和单线程MEX输出匹配的最小状态长度。

在复杂算法中,用解析方法确定状态长度并不容易。在这种情况下,使用分析器计算状态长度。当你设置- s汽车dspunfold调用分析器。分析器计算不同状态长度的输出,并检测多线程MEX文件和单线程MEX文件的输出匹配的最小状态长度。分析器使用给定输入的数值arg游戏.为检测最有效的状态长度,提供随机输入arg游戏.在该模式下,不能进行输入coder.typeof参数.由于该工具需要额外的分析,生成MEX文件的时间增加了。

在代码路径依赖于输入值的算法上使用自动状态长度检测时,请使用选择状态长度最长的代码路径的输入。此外,输入必须对输出产生直接影响。如果输入选择了触发运行时错误的代码路径,自动状态长度检测就会停止,分析器也会停止。确保MATLAB函数支持代码生成,并且对于测试中的输入没有运行时错误。万博1manbetx在调用之前dspunfold,叫codegen在入口点MATLAB函数。此外,模拟入口点MATLAB函数以确保它没有运行时错误。

线程

- toption指定多线程MEX文件使用的线程数。

增加这个值可以提高多线程的MEX速度,但代价是更大的延迟。减小这个值可以减少延迟,并可能降低多线程MEX加速。

重复的因素

重复的因素每个线程在一个处理步骤中处理的连续帧数。

增加这个值可以减少每帧数据的开销,可能会以更大的延迟为代价提高速度。降低这个值可以降低延迟,并可能降低多线程MEX加速。

自我诊断分析仪

自诊断分析器功能是一个帮助工具,由MEX文件生成。这个函数测量多线程MEX文件相对于单线程MEX文件的加速增益。分析器函数还验证多线程MEX文件和单线程MEX文件的输出是否匹配。

如果指定了不正确的状态长度值,输出通常不匹配。为了检查多线程MEX文件和单线程MEX文件之间的数值匹配,为分析器的每个输入参数提供至少两个不同的帧。帧是沿着第一个维度附加的。分析器在这些帧之间交替,同时验证输出是否匹配。未能为每个输入提供多个帧会降低分析仪的有效性,并可能导致假阳性验证结果。换句话说,分析器可能产生通过1即使指定了不正确的状态长度值也会产生结果。分析仪通过最大3 × (2×线程×重复)的框架。如果你的算法需要超过3 × (2×线程×重复)帧来验证结果,那么分析仪不能准确地验证。

提示

一般

  • 不要在多线程MEX文件中显示图、作用域或执行其他用户界面操作。生成的MEX文件可能有意外的行为。

  • 不要使用coder.extrinsic里面输入MATLAB函数。生成的MEX文件可能有意外的行为。

当状态长度小于或等于(线程- 1重复帧:

  • 不要在MATLAB函数中使用随机数。单线程MEX文件和多线程MEX文件的输出可能不匹配。另外,连续执行多线程MEX文件的输出可能不匹配。分析仪可能无法通过数值匹配验证。

    建议您在入口点MATLAB函数之外生成随机数,并将其作为函数的参数传递。

  • 不要在MATLAB函数入口点以外的任何地方使用全局变量或持久变量。例如,避免在子函数中使用持久变量。生成的MEX文件可能产生不准确的结果。一般情况下,不建议使用全局变量。

  • 不要从多线程MEX文件中访问I/O资源。生成的MEX文件可能有意外的行为。这些资源包括文件写入器和读取器、UDP套接字、音频播放器和录音机。

  • 不要在多线程MEX文件中使用带有交互式输入(例如键盘)的函数。生成的MEX文件可能有意外的行为。

工作流

  • 要生成具有所需加速和延迟的有效多线程MEX文件,请执行使用dspspread生成多线程MEX文件的工作流程

  • 使用前dspunfold,叫codegen对MATLAB函数的入口点,并确保该函数成功生成MEX文件。

  • 生成后使用多线程的MEX文件dspunfold,运行analyzer函数。确保分析器函数通过。该规则的例外情况是,算法产生的结果在统计上匹配,但在数值上不匹配。在这个例外中,分析器函数没有通过,即使dspunfold函数生成有效的多线程MEX文件。有关示例,请参见“分析器限制”。

  • 有关使用MEX文件和分析器的帮助,请在MATLAB命令提示符处输入帮助< mexfile名称>而且帮助<分析仪名称>

国家长

  • 如果您选择的状态长度大于或等于确切的状态长度值,分析器将通过。如果分析器失败,增加状态长度,重新生成MEX文件,并再次验证。

  • 如果状态长度大于0,输入标记为帧(通过- f选项)都必须具有相同的尺寸。

  • 在生成MEX文件并运行分析器时,使用调用相同状态长度的输入。

状态长度自动检测

当你设置- s汽车

  • 如果入口点MATLAB函数中的算法根据输入值选择代码路径,则使用选择状态长度最长的代码路径的输入。

  • 提供随机输入arg游戏

  • 选择对输出有直接影响的输入。看到为什么分析器选择零状态长度?

分析仪

  • 确保多线程MEX文件和单线程MEX文件的输出不包含或者一个.分析器不能进行数值检查和返回通过作为.自动状态长度检测工具检测无限状态长度并显示警告

    警告

    即使是无限状态长度,多线程MEX文件的输出结果也与单线程MEX文件的输出结果不匹配。一个可能的原因是,即使输入值相同,输入MATLAB函数在连续运行之间也会产生不同的输出结果。

  • 为分析器的每个输入提供多个具有不同值的帧。为了提高分析器的有效性,沿着第一个维度附加连续的帧。

  • 向分析器提供输入,以实现有效的代码覆盖。

加速

  • 要提高多线程MEX文件的速度,请在示例中指定确切的状态长度。的至少一个项,可以指定样本中的状态长度frameinputs真正的.样本的使用减少了开销并提高了速度。

  • 要以更大的延迟为代价来提高加速,您可以:

    • 增加重复系数。使用- r选择。

    • 增加线程数。使用- t选择。

  • 对于每个可以划分为样本而不改变算法行为的输入,将帧状态设置为真正的使用- f选择。然后在示例中考虑输入,这可以提高生成的多线程MEX文件的速度。

算法

多线程MEX文件将多个输入信号帧缓冲到的缓冲区中2×线程×重复帧,线程线程数,和重复是重复因子。MEX文件使用多个核心同时处理这些帧。这个过程引入了一些确定性延迟,其中延迟2×线程×重复.延迟与通过增加线程数量或重复因子可能获得的加速相互抵消。

版本历史

在R2015b中引入