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