Избегайте дублирующихся функций в сгенерированном коде

Проблема

Вы генерируете код, и он содержит несколько, дубликаты тех же функций, только с незначительными различиями, такими как модификации к функциональной подписи. Например, ваш сгенерированный код может содержать функции под названием foo и b_foo. Дублирующиеся функции могут сделать сгенерированный код более трудным анализировать и справиться.

Причина

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

  • Количество переменных ввода или вывода.

  • Тип переменных ввода или вывода.

  • Размер переменных ввода или вывода.

  • Значения входных переменных.

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

Решение

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

Идентифицируйте дублирующиеся функции при помощи отчета генерации кода

Можно определить, создал ли генератор кода дублирующиеся функции путем осмотра отчета генерации кода или в Simulink®, отчете функции MATLAB. Отчет показывает список дублирующихся функций под функцией точки входа. Например:

Дублирующиеся функции, сгенерированные для нескольких входных размеров

Если ваш код MATLAB вызывает функцию многократно и передает входные параметры различных размеров, генератор кода может создать специализации функции для каждого размера. Чтобы избежать этой проблемы, используйте coder.ignoreSize на входном параметре функции. Например, этот код использует coder.ignoreSize постараться не создавать несколько копий функционального indexOf:

function [out1, out2] = test1(in)
  a = 1:10;
  b = 2:40;
  % Without coder.ignoreSize duplicate functions are generated
  out1 = indexOf(coder.ignoreSize(a), in);
  out2 = indexOf(coder.ignoreSize(b), in);
end

function index = indexOf(array, value)
  coder.inline('never');
  for i = 1:numel(array)
      if array(i) == value
          index = i;
          return
      end
  end
  index = -1;
  return
end

Сгенерировать код, введите:

codegen test1 -config:lib -report -args {1}

Дублирующиеся функции, сгенерированные для различных входных значений

Если ваш код MATLAB вызывает функцию и передает несколько различных постоянных входных параметров, генератор кода может создать специализации функции для каждой различной константы. В этом случае используйте coder.ignoreConst указать к генератору кода, чтобы не обработать значение как неизменяемую константу. Например:

function [out3, out4] = test2(in)
  c = ['a', 'b', 'c'];
  if in > 0
      c(2)='d';
  end
  out3 = indexOf(c, coder.ignoreConst('a')); 
  out4 = indexOf(c, coder.ignoreConst('b')); 
end


function index = indexOf(array, value)
  coder.inline('never');
  for i = 1:numel(array)
      if array(i) == value
          index = i;
          return
      end
  end
  index = -1;
  return
end

Сгенерировать код, введите:

codegen test2 -config:lib -report -args {1}

Дублирующиеся функции, сгенерированные для различного количества Выходных параметров

Если ваш код MATLAB вызывает функцию и принимает различное количество выходных параметров на различных сайтах вызова, генератор кода может произвести специализации для каждого вызова. Например:

[a b] = foo();
c = foo();

Чтобы сделать каждый пропущенный вызов тем же количеством выходных параметров и избежать дублирующихся функций, используйте ~ символ:

[a b] = foo();
[c, ~] = foo();

Смотрите также

| |

Похожие темы