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

В этом примере показано, как использовать 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 функция. Этот пример показывает, как это сделать при использовании входа 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 выполняет две конечные импульсные характеристики.

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, необходимо указать длину состояния, соответствующую этим двум конечным импульсным характеристикам фильтрам. Укажите 1s, чтобы указать, что длина состояния не превышает 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 является суммой длины состояния двух конечных импульсных характеристик фильтров (127 + 256 = 383). Использование -f аргумент, пометьте первый входной параметр как true ( система координат), а последние два входных параметров как false ( несистемы координат)

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, предоставьте по крайней мере две системы координат с различными значениями для каждого входа. Для входов, которые представляют параметры, такие как коэффициенты фильтра, системы координат могут иметь одинаковые значения для каждого входа. В этом примере можно было задать один набор коэффициентов для второго и третьего входов.

См. также

| | | |