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

Проблема

Вы генерируете код, и он содержит несколько повторяющихся копий тех же функций с только небольшими различиями, такими как изменения сигнатуры функции. Например, ваш сгенерированный код может содержать функции, называемые 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();

См. также

| |

Похожие темы