Ускорите код, используя fiaccel

Ускорение выполнения с фиксированной точкой с помощью fiaccel

Можно преобразовать MATLAB с фиксированной точкой® код для MEX-функций с помощью fiaccel. Сгенерированные MEX-функции содержат оптимизации, чтобы автоматически ускорить алгоритмы с фиксированной точкой до скомпилированной скорости кода C/C + + в MATLAB. The fiaccel функция может значительно увеличить скорость выполнения ваших алгоритмов.

Работает 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

Пробная версия 1: Лучшая эффективность

Лучший способ ускорить выполнение алгоритма - скомпилировать весь алгоритм с помощью 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

Пробная версия 2: Худшая эффективность

Компиляция только наименьших модулей расчета с помощью fiaccel функция приводит к гораздо более медленному выполнению. В некоторых случаях накладные расходы, связанные с вызовом mex функция внутри вложенного цикла может вызвать даже более медленное выполнение, чем использование только функций MATLAB. Оценка эффективности mex функция, когда компилируется только наименьший модуль расчета, запускает следующий код.

Первый фрагмент кода выполняет алгоритм, используя только функции MATLAB. Второй фрагмент кода компилирует наименьший модуль расчета с fiaccel function, оставив остальную часть расчетов в 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.02364241
Пробная версия 2: Худшая эффективность
t_scalar_sum_m (4)10.2067 431.71 2.08017
t_scalar_sum_mex (3)4.90664 207.536

Переопределение типа данных с использованием fiaccel

Fixed-Point Designer™ программное обеспечение поставляется с примером того, как сгенерировать MEX-функцию из кода MATLAB. Код в примере принимает взвешенное среднее значение сигнала, чтобы создать lowpass фильтр. Чтобы запустить пример в браузере документации, выберите MATLAB Examples в разделе Fixed-Point Designer, а затем выберите Fixed-Point Lowpass Filtering Using MATLAB для генерации кода.

Можно задать переопределение типа данных в этом примере, введя дополнительную команду в подсказке MATLAB в разделе «Задайте параметры фиксированной точки» примера. Чтобы включить переопределение типа данных, введите следующую команду в подсказке MATLAB после запуска reset(fipref) команда в этом разделе:

fipref('DataTypeOverride','TrueDoubles')

Эта команда сообщает программному обеспечению Fixed-Point Designer создать все fi объекты с типом fi double. Когда вы компилируете код, используя fiaccel команда в разделе «Compile the M-File into a Файл MEX» примера, получившаяся MEX-функция использует данные с плавающей точкой.

Определение значений fimath по умолчанию для MEX-функций

MEX-функции, сгенерированные с fiaccel используйте глобальную fimath MATLAB по умолчанию. Фабрика MATLAB по умолчанию глобальная fimath обладает следующими свойствами:

RoundingMethod: Nearest
OverflowAction: Saturate
ProductMode: FullPrecision
SumMode: FullPrecision

При запуске MEX-функций, которые зависят от fimath по умолчанию MATLAB не изменяйте это значение во время сеанса работы с 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

Измените fimath MATLAB по умолчанию значение больше не совпадает с параметром, используемым во время компиляции.

F = fimath('RoundingMethod','Floor');
globalfimath(F); 

Очистите MEX-функцию от памяти и перезапустите его.

clear test_mex 
test_mex
Обнаруживается несоответствие, и MATLAB генерирует предупреждение.
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 свойства из вашего алгоритма при помощи таблиц типов. Для получения дополнительной информации смотрите Отдельные определения типов данных из алгоритма.

Для просмотра документации необходимо авторизоваться на сайте