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

В этом примере показано, как использовать функцию dspunfold для генерации многопоточного файла MEX из функции MATLAB.

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

Необходимые MathWorks™ продукты:

  • DSP System Toolbox™

  • MATLAB ® Coder™

Введение

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

Использование dspunfold

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

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

2) Вычислите общее гармоническое искажение (THD), отношение сигнал/шум (ОСШ), отношение сигнала к шуму и искажениям (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 estimate
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. Ниже приведен пример того, как это сделать при использовании входов 4096 удвоений. Сгенерированный файл 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: 16 frames, Threads: 8
Analyzing: spectralAnalysisExample.m
Creating single-threaded MEX file: spectralAnalysisExample_st.mexmaci64
Creating multi-threaded MEX file: spectralAnalysisExample_mt.mexmaci64
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 = 2.0x

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

Развертывание DSP генерирует многопоточный файл MEX, который буферизирует несколько системы координат сигнала и затем обрабатывает эти системы координат одновременно, используя несколько ядер. Этот процесс вводит некоторую детерминированную выходную задержку. Выполнение 'help 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.mexmaci64. For best results, please refrain from interacting with the computer and stop other processes until the analyzer is done.
Latency = 16 frames
Speedup = 2.3x

ans = 

  struct with fields:

    Latency: 16
    Speedup: 2.3114
       Pass: 1

Каждый вход анализатора соответствует входам dspunfoldFIRExample_mt файла MEX. Заметьте, что длина (первая размерность) каждого входа больше ожидаемой длины. Например, dspunfoldFIRExample_mt ожидает кадр 4096 удвоений для своего первого входа, в то время как 4096 * 10 отсчетов были предоставлены для spectralAnalysisExample_analyzer. Анализатор интерпретирует этот вход как 10 системы координат из 4096 выборок. Анализатор чередует эти 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 estimate
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 больше системы координат внутри, прежде чем он начинает обрабатывать их, увеличивая эффективность многопоточности, но за счет более высокой задержки выхода. Кроме того, обратите внимание, что максимально допустимая длина состояния является (threads-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: 80 frames, Threads: 8
Analyzing: spectralAnalysisWithStatesExample.m
Creating single-threaded MEX file: spectralAnalysisWithStatesExample_st.mexmaci64
Creating multi-threaded MEX file: spectralAnalysisWithStatesExample_mt.mexmaci64
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.mexmaci64. For best results, please refrain from interacting with the computer and stop other processes until the analyzer is done.
Latency = 80 frames
Speedup = 2.4x

ans = 

  struct with fields:

    Latency: 80
    Speedup: 2.4061
       Pass: 1

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

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

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

Ссылки

Развертывание DSP в Википедии: развертывание (DSP реализации)