exponenta event banner

Создание многопоточных файлов MEX

В этом примере показано, как использовать dspunfold для создания многопоточного MEX-файла из функции MATLAB ® с использованием технологии развертывания. Функция MATLAB может содержать алгоритм без состояния (не имеет состояний) или с состоянием (имеет состояния).

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

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

  • Toolbox™ системы DSP

  • MATLAB Coder™

Использовать dspunfold с функцией MATLAB, содержащей алгоритм без состояния

Рассмотрим функцию MATLAB dspunfoldDCTExample. Эта функция вычисляет DCT входного сигнала и возвращает значение и индекс точки максимальной энергии.

function [peakValue,peakIndex] = dspunfoldDCTExample(x)
% Stateless MATLAB function computing the dct of a signal (e.g. audio), and
% returns the value and index of the highest energy point

% Copyright 2015 The MathWorks, Inc.

X = dct(x);   
[peakValue,peakIndex] = max(abs(X));

Для ускорения алгоритма общий подход заключается в создании MEX-файла с использованием codegen функция. В этом примере показано, как это сделать при использовании ввода 4096 дублей. Созданный файл MEX, dspunfoldDCTExample_mex, является одноадресной.

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

Для создания многопоточного MEX-файла используйте dspunfold функция. Аргумент -s 0 указывает, что алгоритм в dspunfoldDCTExample является лицом без гражданства.

dspunfold dspunfoldDCTExample -args {(1:4096)'} -s 0

Эта команда создает следующие файлы:

  • Многопоточный MEX-файл dspunfoldDCTExample_mt

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

  • Функция самодиагностического анализатора dspunfoldDCTExample_analyzer

Также создаются три дополнительных файла MATLAB, содержащих справку по каждому из вышеупомянутых файлов.

Чтобы измерить ускорение многопоточного файла MEX относительно однопоточного файла MEX, см. пример функции dspunfoldBenchmarkDCTExample.

function dspunfoldBenchmarkDCTExample
% Function used to measure the speedup of the multi-threaded MEX file
% dspunfoldDCTExample_mt obtained using dspunfold vs the single-threaded MEX
% file dspunfoldDCTExample_st.

% Copyright 2015 The MathWorks, Inc.

clear dspunfoldDCTExample_mt;  % for benchmark precision purpose
numFrames = 1e5;
inputFrame = (1:4096)';

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

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

Чтобы еще больше увеличить скорость, увеличьте значение повторения. Для изменения значения повторения используйте -r флаг. Для получения дополнительной информации о значении повторения см. dspunfold страница ссылки на функцию. Пример указания значения повторения см. в разделе "Использование dspunfold с функцией MATLAB, содержащей алгоритм, учитывающий состояние. "

dspunfold генерирует многопоточный MEX-файл, который буферизирует несколько сигнальных кадров и затем обрабатывает эти кадры одновременно, используя несколько ядер. Этот процесс вводит некоторую детерминированную задержку вывода. Выполнение help dspunfoldDCTExample_mt отображает дополнительную информацию о многопоточном MEX-файле, включая значение задержки вывода. В этом примере выходной сигнал многопоточного MEX-файла имеет задержку 16 кадров относительно его входного сигнала, что не относится к однопоточному MEX-файлу.

Управляемый dspunfoldShowLatencyDCTExample пример. Созданный график отображает выходные данные однопоточных и многопоточных MEX-файлов. Обратите внимание, что выходной сигнал многопоточного MEX задерживается на 16 кадров относительно выходного сигнала однопоточного MEX.

dspunfoldShowLatencyDCTExample;

Используя dspunfold с функцией MATLAB, содержащей алгоритм, учитывающий состояние

Функция MATLAB dspunfoldFIRExample выполняет два фильтра FIR.

type dspunfoldFIRExample
function y = dspunfoldFIRExample(u,c1,c2)
% Stateful MATLAB function executing two FIR filters 

% Copyright 2015 The MathWorks, Inc.

persistent FIRSTFIR SECONDFIR
if isempty(FIRSTFIR)
    FIRSTFIR = dsp.FIRFilter('NumeratorSource','Input port');
    SECONDFIR = dsp.FIRFilter('NumeratorSource','Input port');
end
t = FIRSTFIR(u,c1);
y = SECONDFIR(t,c2);

Для создания многопоточного MEX-файла необходимо указать длину состояния, соответствующую двум фильтрам FIR. Укажите 1, чтобы указать, что длина состояния не превышает 1 кадр.

firCoeffs1 = fir1(127,0.8);
firCoeffs2 = fir1(256,0.2,'High');
dspunfold dspunfoldFIRExample -args {(1:2048)',firCoeffs1,firCoeffs2} -s 1

При выполнении этого кода генерируются:

  • Многопоточный MEX-файл dspunfoldFIRExample_mt

  • Однопоточный файл MEX dspunfoldFIRExample_st

  • Функция самодиагностического анализатора dspunfoldFIRExample_analyzer

  • Соответствующие файлы справки MATLAB для этих трех файлов

Задержка вывода многопоточного MEX-файла составляет 16 кадров. Чтобы измерить ускорение, выполните dspunfoldBenchmarkFIRExample.

dspunfoldBenchmarkFIRExample;
Speedup = 3.9x

Чтобы еще больше увеличить скорость многопоточного MEX-файла, укажите точную длину состояния в образцах. Для этого необходимо указать входные аргументы для dspunfoldFIRExample являются кадрами. В этом примере первый вход является кадром, поскольку элементы этого входа упорядочены во времени. Поэтому его можно дополнительно разделить на подкадры. Последние два входа не являются кадрами, поскольку коэффициенты КИХ-фильтров не могут быть разделены без изменения характера алгоритма. Значение dspunfoldFIRExample Длина состояния функции MATLAB - это сумма длины состояния двух фильтров FIR (127 + 256 = 383). Использование -f аргумент, пометить первый входной аргумент как true (кадр), а два последних входных аргумента как false (nonframes)

dspunfold dspunfoldFIRExample -args {(1:2048)',firCoeffs1,firCoeffs2} -s 383 -f [true,false,false]

Снова измерьте ускорение для результирующего многопоточного MEX с помощью dspunfoldBenchmarkFIRExample функция. Обратите внимание, что ускорение увеличилось, поскольку точная длина состояния была указана в образцах, и dspunfold была способна разделить входные данные кадра.

dspunfoldBenchmarkFIRExample;
Speedup = 6.3x

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

dspunfold dspunfoldFIRExample -args {(1:2048)',firCoeffs1,firCoeffs2} ...
-s 383 -f [true,false,false] -r 5

Снова измерьте ускорение для результирующего многопоточного MEX, используя dspunfoldBenchmarkFIRExample функция. Ускорение снова увеличивается, но задержка вывода теперь составляет 80 кадров. Общая формула задержки вывода: 2*Threads*Repetition кадры. В этих примерах количество Threads равно количеству физических ядер ЦП.

dspunfoldBenchmarkFIRExample;
Speedup = 7.7x

Автоматическое определение длины состояния

Запросить это dspunfold автоматически определить длину состояния, указать -s auto. Эта опция создает эффективный многопоточный MEX-файл, но со значительным увеличением времени генерации, из-за дополнительного анализа, который он требует.

dspunfold dspunfoldFIRExample -args {(1:2048)',firCoeffs1,firCoeffs2} ...
-s auto -f [true,false,false] -r 5
State length: [autodetect] samples, Repetition: 5, Output latency: 40 frames, Threads: 4
Analyzing: dspunfoldFIRExample.m
Creating single-threaded MEX file: dspunfoldFIRExample_st.mexw64
Searching for minimal state length (this might take a while)
Checking stateless ... Insufficient
Checking 2048 samples ... Sufficient
Checking 1024 samples ... Sufficient
Checking 512 samples ... Sufficient
Checking 256 samples ... Insufficient
Checking 384 samples ... Sufficient
Checking 320 samples ... Insufficient
Checking 352 samples ... Insufficient
Checking 368 samples ... Insufficient
Checking 376 samples ... Insufficient
Checking 380 samples ... Insufficient
Checking 382 samples ... Insufficient
Checking 383 samples ... Sufficient
Minimal state length is 383 samples
Creating multi-threaded MEX file: dspunfoldFIRExample_mt.mexw64
Creating analyzer file: dspunfoldFIRExample_analyzer.p

dspunfold проверяет различные длины состояний, используя в качестве входных данных значения, предоставляемые -args вариант. Функция предназначена для нахождения минимальной длины состояния, для которой выходы многопоточного MEX и однопоточного MEX одинаковы. Обратите внимание, что он обнаружил 383, как минимальное значение длины состояния, которое соответствует ожидаемому значению, вычисленному вручную до этого.

Проверка генерируемого многопоточного MEX с помощью генерируемого анализатора

При создании многопоточного MEX-файла с использованием dspunfold, однопоточный файл MEX также создается вместе с функцией анализатора. Для примера с указанием состояния, приведенного в предыдущем разделе, имя анализатора: dspunfoldFIRExample_analyzer.

Целью анализатора является обеспечение быстрого способа измерения скорости многопоточного MEX относительно однопоточного MEX, а также проверка соответствия выходов многопоточного MEX и однопоточного MEX. Выходные данные обычно не совпадают, если указано неверное значение длины состояния.

Запустите анализатор для многопоточного файла MEX, dspunfoldFIRExample_mt, ранее сгенерированный с помощью -s auto вариант.

firCoeffs1_1 = fir1(127,0.8);
firCoeffs1_2 = fir1(127,0.7);
firCoeffs1_3 = fir1(127,0.6);
firCoeffs2_1 = fir1(256,0.2,'High');
firCoeffs2_2 = fir1(256,0.1,'High');
firCoeffs2_3 = fir1(256,0.3,'High');
dspunfoldFIRExample_analyzer((1:2048*3)',[firCoeffs1_1;firCoeffs1_2;firCoeffs1_3],...
[firCoeffs2_1;firCoeffs2_2;firCoeffs2_3]);
Analyzing multi-threaded MEX file dspunfoldFIRExample_mt.mexw64  ... 
Latency = 80 frames
Speedup = 7.8x

Каждый вход анализатора соответствует входам dspunfoldFIRExample_mt MEX-файл. Обратите внимание, что длина (первый размер) каждого ввода больше ожидаемой длины. Например, dspunfoldFIRExample_mt ожидает кадр из 2048 двойных значений для его первого ввода, в то время как 2048 * 3 выборки были предоставлены dspunfoldFIRExample_analyzer. Анализатор интерпретирует этот входной сигнал как 3 кадра из 2048 выборок. Анализатор чередует эти 3 входных кадра по кругу, проверяя, совпадают ли выходы многопоточных и однопоточных файлов MEX.

В таблице показаны входные данные, используемые анализатором на каждом этапе цифровой проверки. Общее количество шагов, вызванных анализатором, составляет 240 или 3*latency, где latency составляет 80 в данном случае.

 

Вход 1

Вход 2

Вход 3

Шаг 1

(1:2048)'

firCoeffs1_1

firCoeffs2_1

Шаг 2

(2049:4096)'

firCoeffs1_2

firCoeffs2_2

Шаг 3

(4097:6144)'

firCoeffs1_3

firCoeffs2_3

Шаг 4

(1:2048)'

firCoeffs1_1

firCoeffs2_1

...

...

...

...

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

См. также

| | | |