Этот пример показывает, как использовать функцию dspunfold
, чтобы сгенерировать многопоточный файл MEX от функции MATLAB®, использующей разворачивающуюся технологию. Функция MATLAB может содержать алгоритм, который является не сохраняющим состояние (не имеет никаких состояний), или с сохранением информации (имеет состояния).
ПРИМЕЧАНИЕ: следующий пример принимает, что текущий хост - компьютер имеет по крайней мере два физических ядра процессора. Представленные снимки экрана, ускорение и значения задержки были собраны с помощью хоста - компьютера с восемью физическими ядрами процессора.
Необходимые продукты MathWorks®:
DSP System Toolbox™
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
. Этот пример показывает, как сделать так при использовании входа 4 096, удваивается. Сгенерированный файл MEX, dspunfoldDCTExample_mex
, является однопоточным.
codegen dspunfoldDCTExample -args {(1:4096)'}
Чтобы сгенерировать многопоточный файл MEX, используйте функцию dspunfold
. Аргумент -s 0
указывает, что алгоритм в dspunfoldDCTExample
является не сохраняющим состояние.
dspunfold dspunfoldDCTExample -args {(1:4096)'} -s 0
Эта команда генерирует эти файлы:
Многопоточный файл MEX dspunfoldDCTExample_mt
Однопоточный dspunfoldDCTExample_st
файла MEX, который идентичен файлу 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
. Для примера о том, как задать значение повторения, смотрите раздел 'Using dspunfold
with a MATLAB Function Containing a Stateful Algorithm'.
dspunfold
генерирует многопоточный файл MEX, который буферизует несколько кадров сигнала и затем обрабатывает эти кадры одновременно, с помощью нескольких ядер. Этот процесс вводит некоторую детерминированную выходную задержку. Выполнение help dspunfoldDCTExample_mt
отображает больше информации о многопоточном файле MEX, включая значение выходной задержки. В данном примере вывод многопоточного файла MEX имеет задержку 16 кадров относительно ее входа, который не имеет место для однопоточного файла MEX.
Запустите пример dspunfoldShowLatencyDCTExample
. Сгенерированный график отображает выводы однопоточных и многопоточных файлов MEX. Заметьте, что вывод многопоточного MEX задерживается 16 кадрами относительно того из однопоточного MEX.
dspunfoldShowLatencyDCTExample;
dspunfold
с функцией MATLAB, содержащей алгоритм с сохранением информацииФункция MATLAB dspunfoldFIRExample
выполняет два КИХ-фильтра.
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, необходимо обеспечить длину состояния, соответствующую двум КИХ-фильтрам. Задайте 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
являются кадрами. В этом примере первый вход является кадром, потому что элементы этого входа упорядочиваются вовремя. Поэтому это может быть далее разделено на подкадры. Последние два входных параметров не являются кадрами, потому что КИХ-коэффициенты фильтров не могут быть подразделены, не изменяя природу алгоритма. Значение длины состояния функции MATLAB dspunfoldFIRExample
является суммой длины состояния двух КИХ-фильтров (127 + 256 = 383). Используя аргумент -f
, отметьте первый входной параметр как верный (кадр) и последние два входных параметра как ложь (некадры)
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 с помощью 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
Каждый вход к анализатору соответствует входным параметрам файла MEX dspunfoldFIRExample_mt
. Заметьте, что длина (первая размерность) каждого входа больше, чем ожидаемая длина. Например, dspunfoldFIRExample_mt
ожидает, что кадр 2 048 удваивается для его первого входа, в то время как 2048*3 выборки были предоставлены dspunfoldFIRExample_analyzer
. Анализатор интерпретирует этот вход как 3 кадра 2 048 выборок. Анализатор чередуется между этими 3 входными кадрами, циркулярными при проверке если выходные параметры многопоточного и однопоточного соответствия файлов MEX.
Таблица показывает входные параметры, используемые анализатором на каждом шаге числовой проверки. Общее количество шагов, вызванных анализатором, 240 или 3*latency
, где latency
равняется 80 в этом случае.
Введите 1 | Введите 2 | Введите 3 | |
---|---|---|---|
Шаг 1 | (1:2048)' |
|
|
Шаг 2 | (2049:4096)' |
|
|
Шаг 3 | (4097:6144)' |
|
|
Шаг 4 | (1:2048)' |
|
|
... | ... | ... | ... |
ПРИМЕЧАНИЕ: Для анализатора, чтобы правильно проверять на числовое соответствие между многопоточным MEX и однопоточным MEX, предоставьте по крайней мере двум кадрам различные значения для каждого входа. Для входных параметров, которые представляют параметры, такие как коэффициенты фильтра, кадры могут иметь те же значения для каждого входа. В этом примере вы, возможно, задали один набор коэффициентов для вторых и третьих входных параметров.
Сгенерируйте Многопоточный файл MEX от функции MATLAB с помощью Разворачивания DSP | Как dspunfold Отличающийся от parfor? | Почему Анализатор выбирает неправильную длину состояния? | Рабочий процесс для Генерации Многопоточного файла MEX, использующего dspunfold | dspunfold