Оптимизация MATLAB CODER в сгенерированном коде

Чтобы улучшить скорость выполнения и использование памяти сгенерированного кода, MATLAB® Coder™ представляет следующую оптимизацию:

Сворачивание констант

Когда возможно, генератор кода оценивает выражения в вашем коде MATLAB, которые включают константы времени компиляции только. В сгенерированном коде это заменяет эти выражения на результат оценок. Это поведение известно как сворачивание констант. Из-за сворачивания констант сгенерированный код не должен оценивать константы во время выполнения.

Следующий пример показывает код MATLAB, который постоянно свернут во время генерации кода. Функциональный MultiplyConstant умножает каждый элемент в матрице скалярной константой. Функция оценивает это постоянное использование продукта трех констант времени компиляции, a, b и c.

function out=MultiplyConstant(in) %#codegen
 a=pi^4;
 b=1/factorial(4);
 c=exp(-1);
 out=in.*(a*b*c);
end

Генератор кода оценивает выражения, включающие константы времени компиляции, a, b и c. Это заменяет эти выражения на результат оценки в сгенерированном коде.

Сворачивание констант может произойти, когда выражения включают скаляры только. Чтобы явным образом осуществить сворачивание констант выражений в других случаях, используйте функцию coder.const. Для получения дополнительной информации смотрите Вызовы функции Сгиба в Константы.

Управляйте сворачиванием констант

Можно управлять максимальным количеством инструкций, которые могут быть постоянно свернуты из командной строки или диалогового окна настроек проекта.

  • В командной строке создайте объект настройки для генерации кода. Установите свойство ConstantFoldingTimeout на значение, которое вы хотите.

    cfg=coder.config('lib');
    cfg.ConstantFoldingTimeout = 200;
  • Используя приложение, в диалоговом окне настроек проекта, на вкладке All Settings, устанавливает полевой тайм-аут Сворачивания констант на значение, которое вы хотите.

Fusion цикла

Когда возможно, генератор кода соединяется, последовательные циклы с тем же количеством сталкивается с единственным циклом в сгенерированном коде. Эта оптимизация уменьшает цикл наверху.

Следующий код содержит последовательные циклы, которые сплавлены во время генерации кода. Функциональный SumAndProduct оценивает сумму и продукт элементов в массиве Arr. Функция использует два отдельных цикла, чтобы оценить сумму y_f_sum и продукт y_f_prod.

function [y_f_sum,y_f_prod] = SumAndProduct(Arr) %#codegen
  y_f_sum = 0;
  y_f_prod = 1;
  for i = 1:length(Arr)
     y_f_sum = y_f_sum+Arr(i);
  end
  for i = 1:length(Arr)
     y_f_prod = y_f_prod*Arr(i);
  end

Код, сгенерированный из этого кода MATLAB, оценивает сумму и продукт в единственном цикле.

Последовательные объединенные Матричные операции

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

Следующий пример содержит код, где последовательные операции над матрицей происходят. Функциональный ManipulateMatrix умножает каждый элемент матричного Mat с factor. К каждому элементу в результате функция затем добавляет shift:

function Res=ManipulateMatrix(Mat,factor,shift)
  Res=Mat*factor;
  Res=Res+shift;
end

Сгенерированный код комбинирует умножение и сложение в единственную операцию цикла.

Недостижимое устранение кода

Когда возможно, генератор кода подавляет генерацию кода из недостижимых процедур в вашем коде MATLAB. Например, если ответвление оператора if, elseif, else недостижимо, то код не сгенерирован для того ответвления.

Следующий пример содержит недостижимый код, который устраняется во время генерации кода. Функциональный SaturateValue возвращает значение на основе области значений его входного параметра x.

function y_b = SaturateValue(x) %#codegen
  if x>0
    y_b = x;
  elseif x>10 %This is redundant
    y_b = 10;
  else
    y_b = -x;
 end

Второе ответвление if, elseif, оператор else недостижим. Если переменный x больше, чем 10, это также больше, чем 0. Поэтому первое ответвление выполняется в предпочтении к второму ответвлению.

MATLAB CODER не генерирует код для недостижимого второго ответвления.

Вызовы memcpy

Чтобы оптимизировать сгенерированный код, который копирует последовательные элементы массива, генератор кода пытается заменить код на вызов memcpy. Вызов memcpy может быть более эффективным, чем код, таким как for - цикл или несколько, последовательные присвоения элемента.

См. memcpy Оптимизацию.

Вызовы memset

Чтобы оптимизировать сгенерированный код, который присваивает литеральную константу последовательным элементам массива, генератор кода пытается заменить код на вызов memset. Вызов memset может быть более эффективным, чем код, таким как for - цикл или несколько, последовательные присвоения элемента.

См. memset Оптимизацию.

Была ли эта тема полезной?