Рабочий процесс для генерации многопоточного файла 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

Анализатор прошел верификацию.

См. также

Функции

Похожие темы