主要内容

多线程MEX文件生成

方法的使用dspunfold函数使用展开技术从MATLAB®函数生成多线程MEX文件。MATLAB函数可以包含无状态(没有状态)或有状态(有状态)的算法。

请注意:假设当前主机至少有两个物理CPU核。所呈现的屏幕截图、加速和延迟值是使用具有六个物理CPU核心的主机收集的。

所需MathWorks™产品:下载188bet金宝搏

  • DSP系统工具箱

  • MATLAB编码器™

使用dsp展开与MATLAB函数包含无状态算法

考虑MATLAB函数dspunfoldDCTExample.这个函数计算输入信号的DCT,并返回最大能量点的值和指数

类型dspunfoldDCTExample.m
function [peakValue,peakIndex] = dspunfoldDCTExample(x) %无状态的MATLAB函数,计算信号(例如音频)的dct, %返回最高能量点的值和索引%X = dct(X);[peakValue,peakIndex] = max(abs(X));结束

为了加快算法的速度,一种常用的方法是使用codegen函数。这个例子展示了在使用4096双精度输入时如何做到这一点。生成的MEX文件,dspunfoldDCTExample_mex,是单线程的。

codegendspunfoldDCTExamplearg游戏{(1:4096)}
代码生成成功。

要生成多线程MEX文件,请使用dspunfold函数。这个论点- s 0中的算法dspunfoldDCTExample是无状态的。

dspunfolddspunfoldDCTExamplearg游戏{(1:4096)}- s0
状态长度:0帧,重复:1,输出延迟:12帧,线程:6分析:dspunfoldDCTExample。m创建单线程MEX文件:dspunfoldDCTExample_st。mexa64创建多线程MEX文件:dspunfoldDCTExample_mt。mexa64创建分析文件:dspunfoldDCTExample_analyzer.p

该命令生成以下文件:

  • 多线程MEX文件dspunfoldDCTExample_mt

  • 单线程MEX文件dspunfoldDCTExample_st与命令获取的MEX文件相同codegen函数

  • 自诊断分析仪功能dspunfoldDCTExample_analyzer

另外还生成了三个MATLAB文件,其中包含上述每个文件的帮助。

要度量多线程MEX文件相对于单线程MEX文件的加速,请参阅示例函数dspunfoldBenchmarkDCTExample

类型dspunfoldBenchmarkDCTExample
函数dspunfoldBenchmarkDCTExample %用于测量多线程MEX文件% dspunfoldDCTExample_mt与单线程MEX %文件dspunfoldDCTExample_st的速度。版权所有2015 The MathWorks, Inc.%为基准精度目的numFrames = 1e5;inputFrame = (1:4096)';%排除第一次运行从计时测量dspunfoldDCTExample_st(inputFrame);抽搐;%测量执行时间的单线程MEX帧= 1:numFrames dspunfoldDCTExample_st(inputFrame);end timesinglethreading = toc;%排除第一次运行从计时测量dspunfoldDCTExample_mt(inputFrame);抽搐; % measure execution time for the multi-threaded MEX for frame = 1:numFrames dspunfoldDCTExample_mt(inputFrame); end timeMultiThreaded = toc; fprintf('Speedup = %.1fx\n',timeSingleThreaded/timeMultiThreaded);

dspunfoldBenchmarkDCTExample度量所花费的执行时间dspunfoldDCTExample_st而且dspunfoldDCTExample_mt来处理numFrames帧。最后,它输出加速,即多线程MEX文件执行时间与单线程MEX文件执行时间之间的比值。

运行示例。

dspunfoldBenchmarkDCTExample;
加速= 2.9倍

为了进一步提高加速,可以增加重复值。要修改重复值,请使用- r国旗。有关重复值的详细信息,请参见dspunfold函数参考页面。有关如何指定重复值的示例,请参阅“与包含有状态算法的MATLAB函数一起使用dsp展开”一节。

dspunfold生成一个多线程MEX文件,该文件缓冲多个信号帧,然后使用多个核同时处理这些帧。这个过程引入了一些确定性的输出延迟。执行的帮助dspunfoldDCTExample_mt显示有关多线程MEX文件的更多信息,包括输出延迟时间的值。对于本例,多线程MEX文件的输出相对于其输入有16帧的延迟,而单线程MEX文件则不是这样。

运行dspunfoldShowLatencyDCTExample的例子。生成的图形显示单线程和多线程MEX文件的输出。请注意,相对于单线程MEX,多线程MEX的输出延迟了16帧。

dspunfoldShowLatencyDCTExample;

使用dsp展开与MATLAB函数包含状态算法

MATLAB函数dspunfoldFIRExample执行两个FIR滤波器。

类型dspunfoldFIRExample.m
function y = dspunfoldfireexample (u,c1,c2) %有状态的MATLAB函数执行两个FIR滤波器%版权所有2015 The MathWorks, Inc. persistent FIRSTFIR SECONDFIR if isempty(FIRSTFIR) FIRSTFIR = dsp。FIRFilter(“NumeratorSource”、“输入端口”);SECONDFIR = dsp。FIRFilter(“NumeratorSource”、“输入端口”);end t = step(FIRSTFIR,u,c1);y = step(SECONDFIR,t,c2);

要构建多线程MEX文件,必须提供与两个FIR过滤器对应的状态长度。指定1表示状态长度不超过1帧。

firCoeffs1 = fir1(192,0.8);firCoeffs2 = fir1(256,0.2,“高”);dspunfolddspunfoldFIRExamplearg游戏{(1:4096)、firCoeffs1 firCoeffs2}- s1
状态长度:1帧,重复:1,输出延迟:12帧,线程:6分析:dspunfoldfireexample。m创建单线程MEX文件:dspunfoldFIRExample_st。mexa64创建多线程MEX文件:dspunfoldFIRExample_mt. txt。mexa64创建分析器文件:dspunfoldFIRExample_analyzer.p

执行这段代码会生成:

  • 多线程MEX文件dspunfoldFIRExample_mt

  • 单线程MEX文件dspunfoldFIRExample_st

  • 自诊断分析仪功能dspunfoldFIRExample_analyzer

  • 对应的MATLAB帮助文件针对这三个文件

多线程MEX文件的输出延时为12帧。要测量加速,请执行dspunfoldBenchmarkFIRExample

dspunfoldBenchmarkFIRExample;
加速= 1.4倍

为了进一步提高多线程MEX文件的速度,可以在示例中指定确切的状态长度。为此,必须指定对哪个输入参数dspunfoldFIRExample帧。在这个例子中,第一个输入是一个帧,因为这个输入的元素是按时间顺序排列的。因此,它可以进一步划分为子帧。最后两个输入不是帧,因为FIR滤波器系数不能在不改变算法性质的情况下被细分。的值dspunfoldFIRExampleMATLAB函数的状态长度是两个FIR滤波器的状态长度之和(192 + 256 = 448)。使用- f参数,将第一个输入参数标记为真(帧),最后两个输入参数标记为假(非帧)

dspunfolddspunfoldFIRExamplearg游戏{(1:4096)、firCoeffs1 firCoeffs2}- s448- f(真,假,假)
状态长度:448个样本,重复:1,输出延迟:12帧,线程:6分析:dspunfoldfireexample。m创建单线程MEX文件:dspunfoldFIRExample_st。mexa64创建多线程MEX文件:dspunfoldFIRExample_mt. txt。mexa64创建分析器文件:dspunfoldFIRExample_analyzer.p

方法测量生成的多线程MEX的加速dspunfoldBenchmarkFIRExample函数。注意,加速增加是因为在样本中指定了确切的状态长度,而dsp展开能够细分帧输入。

dspunfoldBenchmarkFIRExample;
加速= 2.0倍

通常,通过增加调用时提供的重复(-r)可以进一步提高加速dspunfold.默认重复值为1。当您增加这个值时,多线程MEX会在处理开始之前在内部缓冲更多的帧。增加重复因子可以提高多线程的效率,但以更高的输出延迟为代价。

dspunfolddspunfoldFIRExamplearg游戏{(1:4096)、firCoeffs1 firCoeffs2}...- s448- f(真,假,假)- r5
状态长度:448个样本,重复:5,输出延迟:60帧,线程:6分析:dspunfoldfireexample。m创建单线程MEX文件:dspunfoldFIRExample_st。mexa64创建多线程MEX文件:dspunfoldFIRExample_mt. txt。mexa64创建分析器文件:dspunfoldFIRExample_analyzer.p

方法再次测量结果多线程MEX的加速dspunfoldBenchmarkFIRExample函数。加速再次增加,但输出延迟现在是60帧。一般的输出延迟公式为 2 × 线程 × 重复 .在这些例子中,的数目线程等于物理CPU核数。

dspunfoldBenchmarkFIRExample;
加速= 2.2倍

自动检测状态长度

来请求dspunfold自动检测状态长度,指定- s汽车.这个选项生成一个高效的多线程MEX文件,但是由于需要额外的分析,生成时间会显著增加。

dspunfolddspunfoldFIRExamplearg游戏{(1:4096)、firCoeffs1 firCoeffs2}...- s汽车- f(真,假,假)- r5
状态长度:[自动检测]样本,重复:5,输出延迟:60帧,线程:6分析:dspunfoldfireexample。m创建单线程MEX文件:dspunfoldFIRExample_st。搜索最小状态长度(这可能需要一段时间)检查4096个样品…充分检查2048个样品…充分检查1024个样本…充足的检查512个样本…充分检查256个样本…检查384个样品…检查448个样品…充分检查416个样品… Insufficient Checking 432 samples ... Insufficient Checking 440 samples ... Insufficient Checking 444 samples ... Insufficient Checking 446 samples ... Insufficient Checking 447 samples ... Insufficient Minimal state length is 448 samples Creating multi-threaded MEX file: dspunfoldFIRExample_mt.mexa64 Creating analyzer file: dspunfoldFIRExample_analyzer.p

dspunfold类提供的值作为输入,检查不同的状态长度arg游戏选择。该函数的目的是找到多线程MEX和单线程MEX输出相同的最小状态长度。注意,它找到了448作为最小状态长度值,它与之前手动计算的期望值相匹配。

使用生成的分析器验证生成的多线程MEX

当使用dsp展开创建多线程MEX文件时,单线程MEX文件也会连同分析器函数一起创建。对于上一节中的有状态示例,分析器的名称为dspunfoldFIRExample_analyzer

该分析器的目标是提供一种快速方法来测量多线程MEX相对于单线程MEX的加速,并检查多线程MEX和单线程MEX的输出是否匹配。当指定的状态长度值不正确时,输出通常不匹配。

执行多线程MEX文件的分析器,dspunfoldFIRExample_mt生成的- s汽车选择。

firCoeffs1_1 = fir1(192,0.8);firCoeffs1_2 = fir1(192,0.7);firCoeffs1_3 = fir1(192,0.6);firCoeffs2_1 = fir1(256,0.2,“高”);firCoeffs2_2 = fir1(256,0.1,“高”);firCoeffs2_3 = fir1(256,0.3,“高”);dspunfoldFIRExample_analyzer((1:4096 * 3)”,[firCoeffs1_1; firCoeffs1_2; firCoeffs1_3],...[firCoeffs2_1; firCoeffs2_2; firCoeffs2_3]);
分析多线程MEX文件dspunfoldFIRExample_mt.mexa64。为了获得最佳结果,请避免与计算机交互,并停止其他进程,直到分析仪完成。延迟= 60帧加速= 2.4倍

分析器的每个输入都对应于dspunfoldFIRExample_mt墨西哥人文件。注意,每个输入的长度(第一维)都大于预期长度。例如,dspunfoldFIRExample_mt期望第一次输入的帧是4096倍,而 4096 × 3. 样本提供给dspunfoldFIRExample_analyzer.分析器将此输入解释为3帧4096个样本。分析器在这3个输入帧之间循环切换,同时检查多线程和单线程MEX文件的输出是否匹配。

该表显示了分析仪在数值检查的每一步所使用的输入。分析器调用的总步骤数是180或 3. × 延迟 ,在那里 延迟 在这里是60。

| input1 | input2 | input3

------+----------------+--------------+--------------

Step1 | (1:4096)' | firCoeffs1_1 | firCoeffs2_1

Step2 | (4097:8192)' | firCoeffs1_2 | firCoeffs2_2

Step3 | (8193:12288)' | firCoeffs1_3 | firCoeffs2_3

Step4 | (1:4096)' | firCoeffs1_1 | firCoeffs2_1

...|……|……|……

注意:为了让分析器正确地检查多线程MEX和单线程MEX之间的数值匹配,为每个输入提供至少两个具有不同值的帧。对于表示参数的输入,例如滤波器系数,帧对于每个输入可以有相同的值。在本例中,您可以为第二个和第三个输入指定一组系数。

参考文献

另请参阅

相关的话题