主要内容

从MATLAB函数使用展开生成一个多线程MEX文件

方法的使用dspunfold函数从MATLAB中生成多线程MEX文件®函数。

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

所需MathWorks™产品:2022世界杯八强谁会赢?

  • DSP系统工具箱

  • MATLAB®编码器™

简介

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

使用dspunfold

考虑MATLAB函数spectralAnalysisExample.该函数执行以下算法:

1)计算输入的单边谱估计

2)计算频谱的总谐波失真(THD)、信噪比(SNR)、信噪失真比(SINAD)和杂散自由动态范围(SFDR)

类型spectralAnalysisExample
function [THD,SNR,SINAD,SFDR] = spectralAnalysisExample(x) % %版权所有2015-2016 The MathWorks, Inc. persistent powerSpectrum if isempty(powerSpectrum) powerSpectrum = dsp.SpectrumEstimator('FrequencyRange','onesided',…“SampleRate”,8000年,…' SpectralAverages ', 1);得到单边谱估计Pxx = powerSpectrum(x);计算测量值[amp, harmSum, totalNoise, maxSpur] =…getHarmonicDistortion(…getFrequencyVector(powerSpectrum), Pxx, getRBW(powerSpectrum), 6);THD = 10*log10(harmSum/amp(1));信噪比= 10*log10(amp(1)/totalNoise);SINAD = 10*log10(amp(1)/(harmSum + totalNoise)); SFDR = 10*log10(amp(1)/maxSpur);

为了加快算法的速度,一种常用的方法是使用codegen函数。下面是使用4096双精度输入时如何执行此操作的示例。生成的MEX文件dspunfoldDCTExample_mex是单线程的。

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

要生成多线程MEX文件,请使用dspunfold函数。参数-s表示spectralAnalysisExample中的算法没有状态。

dspunfoldspectralAnalysisExamplearg游戏{(1:4096)}- s0
状态长度:0帧,重复:1,输出延迟:8帧,线程:4分析:spectralAnalysisExample。m创建单线程MEX文件:spectralAnalysisExample_st。mexa64创建多线程MEX文件:spectralAnalysisExample_mt。mexa64创建分析器文件:spectralAnalysisExample_analyzer.p

这将生成以下文件:

  • 多线程MEX文件,spectralAnalysisExample_mt

  • 单线程MEX文件,spectralAnalysisExample_st(与使用codegen函数)

  • 自诊断分析仪功能,spectralAnalysisExample_analyzer

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

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

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

dspunfoldBenchmarkSpectrumExample;
加速= 1.3x

通过增加repeat值可以进一步提高加速,这将在后面讨论。

DSP展开生成一个多线程MEX文件,该文件缓冲多个信号帧,然后使用多核同时处理这些帧。这个过程引入了一些确定性的输出延迟。执行'help spectralAnalysisExample_mt'将显示有关多线程MEX文件的更多信息,其中之一是输出延迟的值。对于本例,多线程MEX文件的输出相对于其输入有16帧的延迟,而单线程MEX文件则不是这样。下图是由dspunfoldShowLatencySpectrumExample,显示单线程和多线程MEX文件的输出。请注意,相对于单线程MEX,多线程MEX的输出延迟了16帧。

dspunfoldShowLatencySpectrumExample;

图spectralAnalysisExample_mt输出延迟包含一个axis对象。输出延迟为8帧的axis对象包含3个line类型的对象。这些对象表示单线程MEX,多线程MEX,多线程MEX移动了8帧。

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

在创建多线程MEX文件时使用dspunfold,单线程MEX文件也与分析器函数一起创建。对于本例,分析器的名称为spectralAnalysisExample_analyzer

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

下面的示例执行多线程MEX文件dspunfoldFIRExample_mt的分析器。

Fs = 8000;NumFrames = 10;t = (1/Fs) * (0:4096*NumFrames-1);T = T .';F = 100;X = sin(2*pi*f*t) + .01 * randn(size(t));spectralAnalysisExample_analyzer (x)
分析多线程MEX文件spectralAnalysisExample_mt.mexa64。为了获得最佳结果,请避免与计算机交互,并停止其他进程,直到分析仪完成。延迟= 8帧加速= 0.9倍
ans =带字段的结构:延迟:8加速:0.8647通过:1

分析器的每个输入都对应于dspunfoldFIRExample_mt墨西哥人文件。注意,每个输入的长度(第一维)都大于预期长度。例如,dspunfoldFIRExample_mt对于第一个输入,期望4096个双精度帧,而4096*10个样本被提供给spectralAnalysisExample_analyzer.分析器将此输入解释为包含4096个样本的10帧。分析器在这10个输入帧之间交替(以循环方式),同时检查多线程和单线程MEX文件的输出是否匹配。

注意:为了让分析器正确检查多线程MEX和单线程MEX之间的数值匹配,建议您为每个输入提供至少2个具有不同值的帧。

指定状态和重复值

让我们修改光谱测量示例,将光谱估计的光谱平均长度设置为4而不是1。频谱估计现在是当前估计和前三次估计的运行平均值。该算法的状态长度为3帧。MATLAB函数spectralAnalysisWithStatesExample包含修改后的算法:

类型spectralAnalysisWithStatesExample
function [THD,SNR,SINAD,SFDR] = spectralAnalysisWithStatesExample(x) % %版权所有2015-2016 The MathWorks, Inc. persistent powerSpectrum if isempty(powerSpectrum) powerSpectrum = dsp.SpectrumEstimator('FrequencyRange','onesided',…“SampleRate”,8000年,…“SpectralAverages”,4);得到单边谱估计Pxx = powerSpectrum(x);计算测量值[amp, harmSum, totalNoise, maxSpur] =…getHarmonicDistortion(…getFrequencyVector(powerSpectrum), Pxx, getRBW(powerSpectrum), 6);THD = 10*log10(harmSum/amp(1));信噪比= 10*log10(amp(1)/totalNoise);SINAD = 10*log10(amp(1)/(harmSum + totalNoise)); SFDR = 10*log10(amp(1)/maxSpur);

要构建多线程MEX文件,我们必须提供与两个FIR过滤器对应的状态长度。在调用dsp展开时指定-s 3表示状态长度不超过3帧。

通过增加调用时提供的重复(-r),可以进一步提高加速dspunfold.默认重复值为1。增加这个值会使多线程MEX缓冲区在开始处理之前在内部增加更多帧,从而提高多线程的效率,但代价是更高的输出延迟。还要注意,允许的最大状态长度是(threads-1)* repeat *FrameSize帧。如果指定的状态长度超过该值,则dsp展开返回单线程MEX。如果应用程序可以容忍延迟,则增加重复值可以生成具有较长状态的多线程MEX。

下面的命令使用重复值5和状态长度3帧生成一个多线程MEX函数:

dspunfoldspectralAnalysisWithStatesExamplearg游戏{(1:4096)}- s3.- r5
状态长度:3帧,重复:5,输出延迟:40帧,线程:4分析:spectralAnalysisWithStatesExample。m创建单线程MEX文件:spectralAnalysisWithStatesExample_st。mexa64创建多线程MEX文件:spectralAnalysisWithStatesExample_mt。mexa64创建分析文件:spectralAnalysisWithStatesExample_analyzer.p

该分析器可用于验证多线程MEX的数值结果,并提供加速和延迟信息:

L = 4096;NumFrames = 10;sin = dsp。SineWave (“SamplesPerFrame”,L * NumFrames,“SampleRate”, 8000);x = sin () + 0.01 * randn(L * NumFrames, 1);spectralAnalysisWithStatesExample_analyzer (x)
分析多线程MEX文件spectralAnalysisWithStatesExample_mt.mexa64。为了获得最佳结果,请避免与计算机交互,并停止其他进程,直到分析仪完成。延迟= 40帧加速= 1.4倍
ans =带字段的结构:延迟:40加速:1.4150通过:1

仿真例子

这个函数dspunfoldNoisySineExample演示了使用多线程MEX来估计噪声正弦波的频谱特征。测量结果在时间范围内绘制出来。将多线程MEX的性能与MATLAB仿真和单线程MEX的性能进行了比较。即使考虑到测试平台的绘图和输入信号生成所带来的开销,多线程MEX的收益仍然是明显的。

dspunfoldNoisySineExample

MATLAB Sim/单线程MEX加速:2.7 MATLAB Sim/多线程MEX加速:2.6

参考文献

[1] DSP在维基百科上展开:展开(DSP实现)

Baidu
map