exponenta event banner

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

Для повышения скорости выполнения и использования памяти генерируемого кода 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;
  • С помощью приложения в диалоговом окне «Параметры проекта» на вкладке «Все параметры» установите в поле «Время ожидания сворачивания константы» нужное значение.

Слияние петель

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

Следующий код содержит последовательные циклы, которые плавятся во время генерации кода. Функция 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 не генерирует код для недоступной второй ветви.

memcpy Требования

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

См. раздел Оптимизация memcpy.

memset Требования

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

См. раздел Оптимизация memset.