Код 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 создает файлы в следующих расположениях:
| Генерирует: | В: |
|---|---|
Файлы MEX для конкретной платформы | Текущая папка |
отчеты о создании кода (если во время компиляции возникают ошибки или предупреждения) | Папка вывода по умолчанию: fiaccel/mex/M_fcn_name/html |
Можно изменить имя и расположение созданных файлов с помощью опций -o и -d при выполнении fiaccel.
В этом примере используется fiaccel для компиляции различных частей простого алгоритма. Сравнивая время выполнения двух случаев, вы увидите преимущества и лучшее использование fiaccel функция.
Алгоритм, используемый в этом примере, воспроизводит функциональные возможности MATLAB sum функция, которая суммирует столбцы матрицы. Чтобы просмотреть алгоритм, введите 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 функция. MATLAB tic и 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/Лучший | 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. Код в примере принимает средневзвешенное значение сигнала для создания фильтра нижних частот. Чтобы запустить пример в браузере справки, выберите MATLAB Examples в разделе Fixed-Point Designer, а затем выберите Fixed-Point Lowpass Filtering Using MATLAB for Code Generation.
В этом примере можно указать переопределение типа данных, введя дополнительную команду в подсказке MATLAB в разделе «Определение параметров фиксированной точки» примера. Чтобы включить переопределение типа данных, введите следующую команду в подсказке MATLAB после запуска reset(fipref) команда в этом разделе:
fipref('DataTypeOverride','TrueDoubles')Эта команда позволяет программному обеспечению Fixed-Point Designer создавать все fi объекты с типом fi
double. При компиляции кода с помощью fiaccel в разделе примера «Compile the M-File to 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_mextestglobalfimath_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: 15fimath с помощью таблиц типов. Дополнительные сведения см. в разделе Отдельные определения типов данных из алгоритма.