Сгенерируйте Многопоточный файл MEX от функции MATLAB с помощью Разворачивания DSP

Этот пример показывает, как использовать dspunfold функцию, чтобы сгенерировать многопоточный файл MEX от функции MATLAB.

ПРИМЕЧАНИЕ: следующее принимает, что текущий хост - компьютер имеет по крайней мере 2 физических ядра процессора. Представленные снимки экрана, ускорение и значения задержки были собраны с помощью хоста - компьютера с 8 физическими ядрами процессора.

Требуемые продукты MathWorks™:

  • DSP System Toolbox™

  • MATLAB® Coder™

Введение

dspunfold генерирует многопоточный файл MEX от функции MATLAB с помощью технологии разворачивания DSP. Эта функция MATLAB может содержать алгоритм, который является не сохраняющим состояние (не имеет никаких состояний), или с сохранением информации (имеет состояния).

Используя dspunfold

Рассмотрите функцию MATLAB spectralAnalysisExample. Функция выполняет следующий алгоритм:

1) Вычислите одностороннюю оценку спектра входа

2) Вычислите общее гармоническое искажение (THD), sigal к шумовому отношению (ОСШ), сигнал к шуму и отношению Искажения (SINAD) и побочному свободному динамическому диапазону (SFDR) спектра

type spectralAnalysisExample
function [THD,SNR,SINAD,SFDR] = spectralAnalysisExample(x)

% Copyright 2015-2016 The MathWorks, Inc.

persistent powerSpectrum
if isempty(powerSpectrum)
  powerSpectrum  = dsp.SpectrumEstimator('FrequencyRange','onesided',...
                              'SampleRate',8000,...
                              'SpectralAverages',1);  
end

% Get one-sided spectrum etimate
Pxx = powerSpectrum(x); 

% Compute measurements
[amp, harmSum, totalNoise, maxSpur] = ...
    getHarmonicDistortion(...
    getFrequencyVector(powerSpectrum), Pxx, getRBW(powerSpectrum), 6);

THD   = 10*log10(harmSum/amp(1));              
SNR   = 10*log10(amp(1)/totalNoise);               
SINAD = 10*log10(amp(1)/(harmSum + totalNoise));
SFDR  = 10*log10(amp(1)/maxSpur);                

Чтобы ускорить алгоритм, общий подход должен сгенерировать файл MEX с помощью функции codegen. Ниже пример того, как сделать так при использовании входа 4 096, удваивается. Сгенерированный файл MEX, dspunfoldDCTExample_mex, является однопоточным.

codegen spectralAnalysisExample -args {(1:4096)'}

Чтобы сгенерировать многопоточный файл MEX, используйте dspunfold функцию. Аргумент-s указывает, что алгоритм в spectralAnalysisExample не имеет никаких состояний.

dspunfold spectralAnalysisExample -args {(1:4096)'} -s 0
State length: 0 frames, Repetition: 1, Output latency: 12 frames, Threads: 6
Analyzing: spectralAnalysisExample.m
Creating single-threaded MEX file: spectralAnalysisExample_st.mexw64
Creating multi-threaded MEX file: spectralAnalysisExample_mt.mexw64
Creating analyzer file: spectralAnalysisExample_analyzer.p

Это сгенерирует следующие файлы:

  • многопоточный файл MEX, spectralAnalysisExample_mt

  • однопоточный файл MEX, spectralAnalysisExample_st (который идентичен файлу MEX, полученному с помощью функции codegen),

  • самодиагностическая функция анализатора, spectralAnalysisExample_analyzer

Чтобы измерить ускорение многопоточного файла MEX относительно однопоточного файла MEX, смотрите функцию, взятую в качестве примера, dspunfoldBenchmarkSpectrumExample:

type dspunfoldBenchmarkSpectrumExample
function dspunfoldBenchmarkSpectrumExample
% Function used to measure the speedup of the multi-threaded MEX file
% obtained using dspunfold vs the single-threaded MEX file

% Copyright 2015 The MathWorks, Inc.

clear spectralAnalysisExample_st;  % for benchmark precision purpose
clear spectralAnalysisExample_mt;  % for benchmark precision purpose

numFrames = 1e5;
inputFrame = (1:4096)';

% exclude first run from timing measurements
spectralAnalysisExample_st(inputFrame); 
tic;  % measure execution time for the single-threaded MEX
for frame = 1:numFrames 
    spectralAnalysisExample_st(inputFrame);
end
timeSingleThreaded = toc;

% exclude first run from timing measurements
spectralAnalysisExample_mt(inputFrame); 
tic;  % 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;
Speedup = 3.5x

Ускорение могло быть улучшено еще больше путем увеличения значения Повторения, которое будет обсуждено позже.

Разворачивание DSP генерирует многопоточный файл MEX, который буферизует несколько кадров сигнала и затем обрабатывает эти кадры одновременно, с помощью нескольких ядер. Этот процесс вводит некоторую детерминированную выходную задержку. Выполнение 'справки spectralAnalysisExample_mt' отображает больше информации о многопоточном файле MEX, одном из них являющийся значением выходной задержки. В данном примере вывод многопоточного файла MEX имеет задержку 16 кадров относительно ее входа, который не имеет место для однопоточного файла MEX. Ниже график, сгенерированный dspunfoldShowLatencySpectrumExample, который отображает выводы однопоточных и многопоточных файлов MEX. Заметьте, что вывод многопоточного MEX задерживается 16 кадрами относительно того из однопоточного MEX.

dspunfoldShowLatencySpectrumExample;

Проверьте получившийся многопоточный 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)
Analyzing multi-threaded MEX file spectralAnalysisExample_mt.mexw64. For best results, please refrain from interacting with the computer and stop other processes until the analyzer is done.
Latency = 12 frames
Speedup = 3.7x

ans = 

    Latency: 12
    Speedup: 3.6814
       Pass: 1

Каждый вход к анализатору соответствует входным параметрам dspunfoldFIRExample_mt файла MEX. Заметьте, что длина (первая размерность) каждого входа больше, чем ожидаемая длина. Например, dspunfoldFIRExample_mt ожидает, что кадр 4 096 удваивается для его первого входа, в то время как 4096*10 выборок были предоставлены spectralAnalysisExample_analyzer. Анализатор интерпретирует этот вход как 10 кадров 4 096 выборок. Анализатор чередуется между этими 10 входными кадрами (круговым способом) при проверке если выходные параметры многопоточного и однопоточного соответствия файлов MEX.

ПРИМЕЧАНИЕ: Для анализатора, чтобы правильно проверять на числовое соответствие между многопоточным MEX и однопоточным MEX, рекомендуется, чтобы вы предоставили по крайней мере 2 кадрам различные значения для каждого входа.

Определение состояния и значений повторения

Давайте изменим спектральный пример измерения путем установки спектральной средней длины оценки спектра к 4 вместо 1. Оценка спектра является теперь рабочим средним значением текущей оценки и трех предыдущих оценок. Этот алгоритм имеет длину состояния 3 кадров. Функция MATLAB spectralAnalysisWithStatesExample содержит измененный алгоритм:

type spectralAnalysisWithStatesExample
function [THD,SNR,SINAD,SFDR] = spectralAnalysisWithStatesExample(x)

% Copyright 2015-2016 The MathWorks, Inc.

persistent powerSpectrum
if isempty(powerSpectrum)
  powerSpectrum  = dsp.SpectrumEstimator('FrequencyRange','onesided',...
                              'SampleRate',8000,...
                              'SpectralAverages',4);  
end

% Get one-sided spectrum etimate
Pxx = powerSpectrum(x); 

% Compute measurements
[amp, harmSum, totalNoise, maxSpur] = ...
    getHarmonicDistortion(...
    getFrequencyVector(powerSpectrum), Pxx, getRBW(powerSpectrum), 6);

THD   = 10*log10(harmSum/amp(1));              
SNR   = 10*log10(amp(1)/totalNoise);               
SINAD = 10*log10(amp(1)/(harmSum + totalNoise));
SFDR  = 10*log10(amp(1)/maxSpur);                

Чтобы создать многопоточный файл MEX, мы должны обеспечить длину состояния, соответствующую двум КИХ-фильтрам. Определение-s 3 при вызове dspunfold указывает, что длина состояния не превышает 3 кадра.

Ускорение может быть увеличено еще больше путем увеличения повторения (-r), обеспечил при вызове dspunfold. Значение повторения по умолчанию равняется 1. Увеличение этого значения заставляет многопоточный MEX буферизовать больше кадров внутренне, прежде чем это начнет обрабатывать их, увеличивая эффективность многопоточности, но за счет более высокой выходной задержки. Также обратите внимание, что максимальная позволенная длина состояния (распараллеливает 1), *Repetition*FrameSize кадры. Если заданная длина состояния превышает то значение, dspunfold падения поддерживают однопоточный MEX. Если задержка может быть допущена приложением, увеличивание значения повторения позволяет генерировать многопоточный MEX с более длинным состоянием.

Команда ниже генерирует многопоточную MEX-функцию с помощью значения повторения 5 и длины состояния 3 кадров:

dspunfold spectralAnalysisWithStatesExample -args {(1:4096)'} -s 3 -r 5
State length: 3 frames, Repetition: 5, Output latency: 60 frames, Threads: 6
Analyzing: spectralAnalysisWithStatesExample.m
Creating single-threaded MEX file: spectralAnalysisWithStatesExample_st.mexw64
Creating multi-threaded MEX file: spectralAnalysisWithStatesExample_mt.mexw64
Creating analyzer file: spectralAnalysisWithStatesExample_analyzer.p

Анализатор может использоваться, чтобы подтвердить числовые результаты многопоточного MEX и обеспечить информация о задержке и ускорение:

L = 4096;
NumFrames = 10;
sine  = dsp.SineWave('SamplesPerFrame',L * NumFrames,'SampleRate',8000);
x     = sine() + 0.01 * randn(L * NumFrames, 1);
spectralAnalysisWithStatesExample_analyzer(x)
Analyzing multi-threaded MEX file spectralAnalysisWithStatesExample_mt.mexw64. For best results, please refrain from interacting with the computer and stop other processes until the analyzer is done.
Latency = 60 frames
Speedup = 3.4x

ans = 

    Latency: 60
    Speedup: 3.3575
       Pass: 1

Пример симуляции

Функция dspunfoldNoisySineExample демонстрирует использование многопоточного MEX, чтобы оценить спектральные характеристики шумной синусоиды. Измерения построены на осциллографе времени. Производительность многопоточного MEX сравнивается с симуляцией MATLAB и однопоточной производительностью MEX. Усиления многопоточного MEX все еще очевидны даже с издержками, принесенными графическим выводом и генерацией входного сигнала испытательного стенда.

dspunfoldNoisySineExample
MATLAB Sim/Single-threaded MEX speedup: 2.3
MATLAB Sim/Multi-threaded MEX speedup: 4.8

Ссылки

DSP, разворачивающийся на Википедию: Разворачивание (реализация DSP)