Можно преобразовать фиксированную точку код MATLAB® в MEX-функции с помощью fiaccel
. Сгенерированные MEX-функции содержат оптимизацию, чтобы автоматически ускорить алгоритмы фиксированной точки к скомпилированной скорости C/C++ кода в MATLAB. fiaccel
функция может значительно увеличить скорость выполнения ваших алгоритмов.
Основная команда:
fiaccel M_fcn
По умолчанию, fiaccel
выполняет следующие действия:
Поиски функционального M_fcn
сохраненный в файле M_fcn
M
как задано в Порядке Поиска Пути к Компиляции.
Компиляции M_fcn
к коду MEX.
Если нет никаких ошибок или предупреждений, генерирует специфичный для платформы файл MEX в текущей папке, с помощью соглашений о присвоении имен, описанных в Соглашениях о присвоении имен Файла.
Если существуют ошибки, не генерирует файл MEX, но производит сообщение об ошибке в выходной папке по умолчанию, как описано в Сгенерированных Файлах и Местоположениях.
Если существуют предупреждения, но никакие ошибки, генерирует специфичный для платформы файл MEX в текущей папке, но действительно сообщает о предупреждениях.
Можно изменить это поведение по умолчанию путем определения одного или нескольких параметров компилятора с fiaccel
, разделенный пробелами на командной строке.
fiaccel
генерирует файлы в следующих местоположениях:
Генерирует: | \in: |
---|---|
Специфичные для платформы файлы MEX | Текущая папка |
генерация кода сообщает (если ошибки или предупреждения происходят во время компиляции), | Выходная папка по умолчанию: fiaccel/mex/M_fcn_name/html |
Можно изменить название и местоположение сгенерированных файлов при помощи опций -o
и -d
когда вы запускаете fiaccel
.
В этом примере вы будете использовать fiaccel
функционируйте, чтобы скомпилировать различные части простого алгоритма. Путем сравнения времени выполнения этих двух случаев вы будете видеть преимущества и лучшее использование fiaccel
функция.
Алгоритм, используемый в этом примере, реплицирует функциональность sum
MATLAB функция, которая суммирует столбцы матрицы. Чтобы видеть алгоритм, введите
open fi_matrix_column_sum.m
в командной строке MATLAB.
function B = fi_matrix_column_sum(A) % Sum the columns of matrix A. %#codegen [m,n] = size(A); w = get(A,'WordLength') + ceil(log2(m)); f = get(A,'FractionLength'); B = fi(zeros(1,n),true,w,f); for j = 1:n for i = 1:m B(j) = B(j) + A(i,j); end end
Лучший способ ускорить осуществление алгоритма состоит в том, чтобы скомпилировать целый алгоритм с помощью fiaccel
функция. Оценивать повышение производительности, обеспеченное fiaccel
функционируйте, когда целый алгоритм скомпилирован, запустите следующий код.
Первый фрагмент кода выполняет алгоритм с помощью только функции MATLAB. Второй фрагмент кода компилирует целый алгоритм с помощью fiaccel
функция. tic
MATLAB и
toc
функции отслеживают время выполнения для каждого метода выполнения.
% MATLAB fipref('NumericTypeDisplay','short'); A = fi(randn(1000,10)); tic B = fi_matrix_column_sum(A) t_matrix_column_sum_m = toc % fiaccel fiaccel fi_matrix_column_sum -args {A} ... -I [matlabroot '/toolbox/fixedpoint/fidemos'] tic B = fi_matrix_column_sum_mex(A); t_matrix_column_sum_mex = toc
Компиляция только самого маленького модуля расчета с помощью fiaccel
функция приводит к намного более медленному выполнению. В некоторых случаях, издержки, которые следуют из вызова mex
функция во вложенном цикле может вызвать еще более медленное выполнение, чем использование одних только функций MATLAB. Оценивать производительность mex
функционируйте, когда только самый маленький модуль расчета скомпилирован, запустите следующий код.
Первый фрагмент кода выполняет алгоритм с помощью только функции MATLAB. Второй фрагмент кода компилирует самый маленький модуль расчета с fiaccel
функция, оставляя остальную часть расчетов MATLAB.
% MATLAB tic [m,n] = size(A); w = get(A,'WordLength') + ceil(log2(m)); f = get(A,'FractionLength'); B = fi(zeros(1,n),true,w,f); for j = 1:n for i = 1:m B(j) = fi_scalar_sum(B(j),A(i,j)); % B(j) = B(j) + A(i,j); end end t_scalar_sum_m = toc % fiaccel fiaccel fi_scalar_sum -args {B(1),A(1,1)} ... -I [matlabroot '/toolbox/fixedpoint/fidemos'] tic [m,n] = size(A); w = get(A,'WordLength') + ceil(log2(m)); f = get(A,'FractionLength'); B = fi(zeros(1,n),true,w,f); for j = 1:n for i = 1:m B(j) = fi_scalar_sum_mex(B(j),A(i,j)); % B(j) = B(j) + A(i,j); end end t_scalar_sum_mex = toc
Сравнение Испытания 1 и Испытания 2 появляется в следующей таблице. Ваш компьютер может записать различные времена, чем те, таблица показывает, но отношения должны быть приблизительно тем же самым. Существует экстремальное различие в отношениях между испытанием, где целый алгоритм был скомпилирован с помощью fiaccel
(t_matrix_column_sum_mex.m
) и где только скалярная сумма была скомпилирована (t_scalar_sum_mex.m
). Даже файл без fiaccel
компиляция (t_matrix_column_sum_m
) добился большего успеха чем тогда, когда только самый маленький модуль расчета был скомпилирован с помощью fiaccel
(t_scalar_sum_mex
).
X (ранг общей производительности) | Время | X/Best | X_m/X_mex |
---|---|---|---|
Испытание 1: лучшая производительность | |||
t_matrix_column_sum_m (2) | 1.99759 | 84.4917 | 84.4917 |
t_matrix_column_sum_mex (1) | 0.0236424 | 1 | |
Испытание 2: худшая производительность | |||
t_scalar_sum_m (4) | 10.2067 | 431.71 | 2.08017 |
t_scalar_sum_mex (3) | 4.90664 | 207.536 |
Программное обеспечение Fixed-Point Designer™ поставляется с примером того, как сгенерировать MEX-функцию из кода MATLAB. Код в примере берет взвешенное среднее сигнала создать фильтр lowpass. Чтобы запустить пример в Браузере документации выбирают MATLAB Examples под Fixed-Point Designer, и затем выбирают Fixed-Point Lowpass Filtering Using MATLAB for Code Generation.
Можно задать переопределение типа данных в этом примере путем ввода дополнительной команды в посдказке MATLAB в разделе “Define Fixed-Point Parameters” примера. Чтобы включить переопределение типа данных, введите следующую команду в посдказке MATLAB после выполнения reset(fipref)
команда в том разделе:
fipref('DataTypeOverride','TrueDoubles')
Эта команда говорит программному обеспечению Fixed-Point Designer создавать весь fi
объекты с типом fi
double
. Когда вы компилируете код с помощью fiaccel
команда в разделе “Compile the M-File into a MEX File” примера, получившаяся MEX-функция использует данные с плавающей точкой.
MEX-функции сгенерированы с fiaccel
используйте значение по умолчанию MATLAB глобальный fimath
. Глобальная переменная заводской настройки MATLAB fimath
имеет следующие свойства:
RoundingMethod: Nearest OverflowAction: Saturate ProductMode: FullPrecision SumMode: FullPrecision
При выполнении MEX-функций, которые зависят от значения по умолчанию MATLAB fimath
значение, не изменяйте это значение во время своего сеанса работы с MATLAB. В противном случае MATLAB генерирует предупреждение, предупреждая вас к несоответствию между временем компиляции и fimath
во время выполнения значения. Например, создайте следующую функцию MATLAB:
function y = test %#codegen y = fi(0);
test
создает fi
объект, явным образом не задавая fimath
объект. Поэтому test
использует fimath
по умолчанию
возразите в действительности во время компиляции. Сгенерируйте MEX-функцию test_mex
использовать заводскую настройку значения по умолчанию MATLAB fimath
.
resetglobalfimath;
fiaccel test
fiaccel
генерирует MEX-функцию, test_mex
, в текущей папке.Запустите test_mex
.
test_mex
ans = 0 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 15
Измените значение по умолчанию MATLAB fimath
значение, таким образом, это больше не совпадает с установкой, используемой во время компиляции.
F = fimath('RoundingMethod','Floor'); globalfimath(F);
Очистите MEX-функцию из памяти и повторно выполните его.
clear test_mex
test_mex
testglobalfimath_mex Warning: This function was generated with a different default fimath than the current default. ans = 0 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 15
fimath
свойства из вашего алгоритма при помощи таблиц типов. Для получения дополнительной информации смотрите Отдельные Определения типов из Алгоритма.