主要内容

多线程MEX文件生成

这个例子展示了如何使用dspunfold函数使用展开技术从MATLAB®函数生成一个多线程MEX文件。MATLAB函数可以包含无状态(无状态)或有状态(有状态)的算法。

请注意:假设当前主机至少有两个物理CPU核。显示的截图、加速和延迟值是使用具有6个物理CPU核的主机收集的。

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

  • DSP系统工具箱™

  • MATLAB编码器™

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

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

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

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

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

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

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

这个命令生成以下文件:

  • 多线程的墨西哥人文件dspunfoldDCTExample_mt

  • 单线程的墨西哥人文件dspunfoldDCTExample_st,它与使用codegen函数

  • 自我诊断分析仪功能dspunfoldDCTExample_analyzer

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

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

类型dspunfoldBenchmarkDCTExample
function dspunfoldBenchmarkDCTExample %用于衡量通过dsp展开获取的多线程MEX文件% dspunfoldDCTExample_mt与单线程MEX文件% dspunfoldDCTExample_st的加速。% Copyright 2015 The MathWorks, Inc. clear dspunfoldDCTExample_mt;%用于基准精度inputFrame = (1:4096) ';%从计时测量中排除第一次运行dspunfoldDCTExample_st(inputFrame);抽搐;%测量单线程MEX的执行时间为frame = 1:numFrames dspunfoldDCTExample_st(inputFrame);end timesinglethread = 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_stdspunfoldDCTExample_mt来处理numFrames帧。最后,输出加速值,即多线程MEX文件执行时间与单线程MEX文件执行时间的比率。

运行示例。

dspunfoldBenchmarkDCTExample;
加速x = 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) % Stateful MATLAB函数执行两个FIR滤波器% Copyright 2015FIRFilter(“NumeratorSource”、“输入端口”);SECONDFIR = dsp。FIRFilter(“NumeratorSource”、“输入端口”);end t = step(FIRSTFIR,u,c1);y =步骤(SECONDFIR t c2);

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

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

执行此代码将生成:

  • 多线程的墨西哥人文件dspunfoldFIRExample_mt

  • 单线程的墨西哥人文件dspunfoldFIRExample_st

  • 自我诊断分析仪功能dspunfoldFIRExample_analyzer

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

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

dspunfoldBenchmarkFIRExample;
加速x = 1.4

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

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

的方法度量得到的多线程MEX的加速dspunfoldBenchmarkFIRExample函数。注意,由于在样本中指定了准确的状态长度,因此加速增加了,并且dsp展开能够细分帧输入。

dspunfoldBenchmarkFIRExample;
加速x = 2.0

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

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

同样,使用dspunfoldBenchmarkFIRExample函数。加速再次增加,但输出延迟现在是60帧。一般的输出延迟公式是 2 × 线程 × 重复 .在这些例子中,数字线程等于物理CPU核数。

dspunfoldBenchmarkFIRExample;
加速x = 2.2

自动检测状态长度

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

dspunfolddspunfoldFIRExamplearg游戏{(1:4096)、firCoeffs1 firCoeffs2}...- s汽车- f(真,假,假)- r5
状态长度:[autodetect]采样,重复:5,输出延迟:60帧,线程:6分析:dspunfoldfireexample。创建单线程MEX文件:dspunfoldFIRExample_st. m搜索最小状态长度(可能需要一段时间)检查无状态…检查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 (0.2, 256“高”);firCoeffs2_2 = fir1 (0.1, 256“高”);firCoeffs2_3 = fir1 (0.3, 256“高”);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 . ' Step1 | (1:4096)' | firCoeffs1_1

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

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

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

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

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

参考文献

另请参阅

||||