exponenta event banner

Рабочий процесс создания многопоточного MEX-файла с использованием dspunfold

  1. Запустите входную функцию MATLAB ® с вводами, которые необходимо проверить. Убедитесь, что функция не содержит ошибок во время выполнения. Звонитьcodegen и убедитесь, что он успешно генерирует файл MEX.

  2. Создание многопоточного MEX-файла с помощью dspunfold. Укажите длину состояния с помощью -s вариант. Длина состояния должна быть, по крайней мере, той же самой длины, что и алгоритм в функции MATLAB. По умолчанию -s имеет значение 0, указывая, что алгоритм не имеет состояния.

  3. Запустите созданную функцию анализатора. Используйте pass флаг для проверки соответствия результатов вывода многопоточного файла MEX и однопоточного файла MEX. Кроме того, проверьте, удовлетворительны ли скорость и задержка, отображаемые функцией анализатора.

  4. Если выходные результаты не совпадают, увеличьте длину состояния и снова создайте многопоточный MEX-файл. Либо используйте автоматическое определение длины состояния (указанное с помощью -s auto) для определения минимальной длины состояния, соответствующей выходам.

  5. Если выходные результаты совпадают, но скорость и задержка неудовлетворительны, увеличьте коэффициент повторения, используя -r или увеличить число потоков с помощью -t. Кроме того, можно настроить длину состояния. Отрегулируйте dspunfold и создавать новые многопоточные MEX-файлы до тех пор, пока вы не будете удовлетворены результатами..

Рекомендации по созданию многопоточного MEX-файла с использованием dspunfold, см. раздел «Советы» dspunfold.

Пример рабочего процесса

Выполнение функции MATLAB точки входа

Создайте функцию MATLAB точки входа.

function [y,mse] = AdaptiveFilter(x,noise)

persistent rlsf1 ffilt noise_var
if isempty (rlsf1)
    rlsf1 = dsp.RLSFilter(32, 'ForgettingFactor', 0.98);
    ffilt = dsp.FIRFilter('Numerator',fir1(32, .25)); % Unknown System
    noise_var = 1e-4;
end

d = ffilt(x) + noise_var * noise; % desired signal
[y,e] = rlsf1(x, d);

mse = 10*log10(sum(e.^2));
end

Функция моделирует фильтр RLS, который фильтрует входной сигнал x, использование d в качестве требуемого сигнала. Функция возвращает отфильтрованные выходные данные в y и ошибка фильтра в e.

Управляемый AdaptiveFilter с вводами, которые требуется проверить. Убедитесь, что функция работает без ошибок.

AdaptiveFilter(randn(1000,1), randn(1000,1));

Звонить codegen на AdaptiveFilter и создайте файл MEX.

codegen AdaptiveFilter -args {randn(1000,1), randn(1000,1)}

Создание многопоточного MEX-файла с помощью dspunfold

Задайте длину состояния как 32 выборки и коэффициент повторения 1. Укажите длину состояния, которая больше или равна длине алгоритма в функции MATLAB. Когда хотя бы одна запись frameinputs имеет значение true, в образцах учитывается длина состояния.

dspunfold AdaptiveFilter -args {randn(1000,1), randn(1000,1)} -s 32 -f true
Analyzing input MATLAB function AdaptiveFilter
Creating single-threaded MEX file AdaptiveFilter_st.mexw64
Creating multi-threaded MEX file AdaptiveFilter_mt.mexw64
Creating analyzer file AdaptiveFilter_analyzer

Выполнение сгенерированной функции анализатора

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

AdaptiveFilter_analyzer(randn(1000*4,1),randn(1000*4,1))
Analyzing multi-threaded MEX file AdaptiveFilter_mt.mexw64  ... 
Latency = 8 frames
Speedup = 3.5x
Warning: The output results of the multi-threaded MEX file AdaptiveFilter_mt.mexw64 do not match 
the output results of the single-threaded MEX file AdaptiveFilter_st.mexw64. Check that you 
provided the correct state length value to the dspunfold function when you generated the 
multi-threaded MEX file AdaptiveFilter_mt.mexw64. For best practices and possible solutions to
this problem, see the 'Tips' section in the dspunfold function reference page. 
> In coder.internal.warning (line 8)
  In AdaptiveFilter_analyzer 

ans = 

    Latency: 8
    Speedup: 3.4686
       Pass: 0

Увеличение длины состояния

Анализатор не прошел проверку. Отображаемое предупреждающее сообщение указывает, что неверное значение длины состояния предоставлено dspunfold функция. Увеличить длину состояния до 1000 и повторите процесс из предыдущего раздела.

dspunfold AdaptiveFilter -args {randn(1000,1),randn(1000,1)} -s 1000 -f true
Analyzing input MATLAB function AdaptiveFilter
Creating single-threaded MEX file AdaptiveFilter_st.mexw64
Creating multi-threaded MEX file AdaptiveFilter_mt.mexw64
Creating analyzer file AdaptiveFilter_analyzer

Запустите созданный анализатор.

AdaptiveFilter_analyzer(randn(1000*4,1),randn(1000*4,1))
Analyzing multi-threaded MEX file AdaptiveFilter_mt.mexw64  ... 
Latency = 8 frames
Speedup = 1.8x

ans = 

    Latency: 8
    Speedup: 1.7778
       Pass: 1

Анализатор прошел проверку. Рекомендуется указать различные цифры для функции анализатора и убедиться, что функция анализатора проходит.

Повышение быстродействия и корректировка задержек

Если вы хотите увеличить скорость и ваша система может позволить себе большую задержку, увеличьте коэффициент повторения до 2.

dspunfold AdaptiveFilter -args {randn(1000,1),randn(1000,1)} -s 1000 -r 2 -f true
Analyzing input MATLAB function AdaptiveFilter
Creating single-threaded MEX file AdaptiveFilter_st.mexw64
Creating multi-threaded MEX file AdaptiveFilter_mt.mexw64
Creating analyzer file AdaptiveFilter_analyzer

Запустите анализатор.

 AdaptiveFilter_analyzer(randn(1000*4,1), randn(1000*4,1))
Analyzing multi-threaded MEX file AdaptiveFilter_mt.mexw64  ... 
Latency = 16 frames
Speedup = 2.4x

ans = 

    Latency: 16
    Speedup: 2.3674
       Pass: 1

Повторяйте процесс до достижения удовлетворительного ускорения и задержки.

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

Выберите длину состояния, которая больше или равна длине состояния алгоритма. Если определить длину состояния для алгоритма аналитически непросто, используйте инструмент автоматического определения длины состояния. Вызвать автоматическое определение длины состояния с помощью параметра -s кому auto. Инструмент определяет минимальную длину состояния, с которой анализатор проходит проверку.

dspunfold AdaptiveFilter -args {randn(1000,1),randn(1000,1)} -s auto -f true
Analyzing input MATLAB function AdaptiveFilter
Creating single-threaded MEX file AdaptiveFilter_st.mexw64
Searching for minimal state length (this might take a while)
Checking stateless ... Insufficient
Checking 1000 ... Sufficient
Checking 500 ... Insufficient
Checking 750 ... Insufficient
Checking 875 ... Sufficient
Checking 812 ... Insufficient
Checking 843 ... Sufficient
Checking 827 ... Insufficient
Checking 835 ... Insufficient
Checking 839 ... Sufficient
Checking 837 ... Sufficient
Checking 836 ... Sufficient
Minimal state length is 836
Creating multi-threaded MEX file AdaptiveFilter_mt.mexw64
Creating analyzer file AdaptiveFilter_analyzer

Минимальная длина состояния - 836 образцы.

Запустите созданный анализатор.

AdaptiveFilter_analyzer(randn(1000*4,1), randn(1000*4,1))
Analyzing multi-threaded MEX file AdaptiveFilter_mt.mexw64  ... 
Latency = 8 frames
Speedup = 1.9x

ans = 

    Latency: 8
    Speedup: 1.9137
       Pass: 1

Анализатор прошел проверку.

См. также

Функции

Связанные темы