Многопоточная генерация файла MEX

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

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

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

  • DSP System Toolbox™

  • MATLAB Coder™

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

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

type dspunfoldDCTExample.m
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));

end

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

codegen dspunfoldDCTExample -args {(1:4096)'}
Code generation successful.

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

dspunfold dspunfoldDCTExample -args {(1:4096)'} -s 0
State length: 0 frames, Repetition: 1, Output latency: 12 frames, Threads: 6
Analyzing: dspunfoldDCTExample.m
Creating single-threaded MEX file: dspunfoldDCTExample_st.mexa64
Creating multi-threaded MEX file: dspunfoldDCTExample_mt.mexa64
Creating analyzer file: dspunfoldDCTExample_analyzer.p

Эта команда генерирует эти файлы:

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

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

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

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

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

type 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 = 2.9x

Чтобы улучшить ускорение еще больше, увеличьте значение повторения. Чтобы изменить значение повторения, используйте -r флаг. Для получения дополнительной информации о значении повторения смотрите dspunfold страница ссылки на функцию. Для примера о том, как задать значение повторения, смотрите раздел 'Using dspunfold with a MATLAB Function Containing a Stateful Algorithm'.

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

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

dspunfoldShowLatencyDCTExample;

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

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

type dspunfoldFIRExample.m
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 = step(FIRSTFIR,u,c1);
y = step(SECONDFIR,t,c2);

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

firCoeffs1 = fir1(192,0.8);
firCoeffs2 = fir1(256,0.2,'High');
dspunfold dspunfoldFIRExample -args {(1:4096)',firCoeffs1,firCoeffs2} -s 1
State length: 1 frames, Repetition: 1, Output latency: 12 frames, Threads: 6
Analyzing: dspunfoldFIRExample.m
Creating single-threaded MEX file: dspunfoldFIRExample_st.mexa64
Creating multi-threaded MEX file: dspunfoldFIRExample_mt.mexa64
Creating analyzer file: dspunfoldFIRExample_analyzer.p

Выполнение этого кода генерирует:

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

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

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

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

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

dspunfoldBenchmarkFIRExample;
Speedup = 1.4x

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

dspunfold dspunfoldFIRExample -args {(1:4096)',firCoeffs1,firCoeffs2} -s 448 -f [true,false,false]
State length: 448 samples, Repetition: 1, Output latency: 12 frames, Threads: 6
Analyzing: dspunfoldFIRExample.m
Creating single-threaded MEX file: dspunfoldFIRExample_st.mexa64
Creating multi-threaded MEX file: dspunfoldFIRExample_mt.mexa64
Creating analyzer file: dspunfoldFIRExample_analyzer.p

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

dspunfoldBenchmarkFIRExample;
Speedup = 2.0x

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

dspunfold dspunfoldFIRExample -args {(1:4096)',firCoeffs1,firCoeffs2} ...
-s 448 -f [true,false,false] -r 5
State length: 448 samples, Repetition: 5, Output latency: 60 frames, Threads: 6
Analyzing: dspunfoldFIRExample.m
Creating single-threaded MEX file: dspunfoldFIRExample_st.mexa64
Creating multi-threaded MEX file: dspunfoldFIRExample_mt.mexa64
Creating analyzer file: dspunfoldFIRExample_analyzer.p

Снова, измерьте ускорение для получившегося многопоточного MEX, с помощью dspunfoldBenchmarkFIRExample функция. Ускорение увеличивается снова, но выходная задержка является теперь 60 системами координат. Общая выходная формула задержки 2×Threads×Repetitionframes. В этих примерах, количестве Threads равно количеству физических ядер процессора.

dspunfoldBenchmarkFIRExample;
Speedup = 2.2x

Обнаружение длины состояния автоматически

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

dspunfold dspunfoldFIRExample -args {(1:4096)',firCoeffs1,firCoeffs2} ...
-s auto -f [true,false,false] -r 5
State length: [autodetect] samples, Repetition: 5, Output latency: 60 frames, Threads: 6
Analyzing: dspunfoldFIRExample.m
Creating single-threaded MEX file: dspunfoldFIRExample_st.mexa64
Searching for minimal state length (this might take a while)
Checking stateless ... Insufficient
Checking 4096 samples ... Sufficient
Checking 2048 samples ... Sufficient
Checking 1024 samples ... Sufficient
Checking 512 samples ... Sufficient
Checking 256 samples ... Insufficient
Checking 384 samples ... Insufficient
Checking 448 samples ... Sufficient
Checking 416 samples ... Insufficient
Checking 432 samples ... Insufficient
Checking 440 samples ... Insufficient
Checking 444 samples ... Insufficient
Checking 446 samples ... Insufficient
Checking 447 samples ... Insufficient
Minimal state length is 448 samples
Creating multi-threaded MEX file: dspunfoldFIRExample_mt.mexa64
Creating analyzer file: dspunfoldFIRExample_analyzer.p

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

Проверьте сгенерированный многопоточный MEX Используя сгенерированный Анализатор

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

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

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

firCoeffs1_1 = fir1(192,0.8);
firCoeffs1_2 = fir1(192,0.7);
firCoeffs1_3 = fir1(192,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:4096*3)',[firCoeffs1_1;firCoeffs1_2;firCoeffs1_3],...
[firCoeffs2_1;firCoeffs2_2;firCoeffs2_3]);
Analyzing multi-threaded MEX file dspunfoldFIRExample_mt.mexa64. For best results, please refrain from interacting with the computer and stop other processes until the analyzer is done.
Latency = 60 frames
Speedup = 2.4x

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

Таблица показывает входные параметры, используемые анализатором на каждом шаге числовой проверки. Общее количество шагов, вызванных анализатором, равняется 180 или 3×latency, где latency 60 в этом случае.

| input1 | input2 | input3

------+----------------+--------------+--------------

Step1 | (1:4096)' | firCoeffs1_1 | firCoeffs2_1

Step2 | (4097:8192)' | firCoeffs1_2 | firCoeffs2_2

Step3 | (8193:12288)' | firCoeffs1_3 | firCoeffs2_3

Step4 | (1:4096)' | firCoeffs1_1 | firCoeffs2_1

... | ... | ... | ...

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

Смотрите также

| | | |