Можно сократить количество копий в сгенерированном коде путем записи функций, которые используют ту же переменную и в качестве входа и в качестве вывода. Например:
function A = foo( A, B ) %#codegen A = A * B; end
Эта практика кодирования использует оптимизацию параметра ссылки. Когда переменная действует как оба ввода и вывода, сгенерированный код передает переменную ссылкой вместо того, чтобы избыточно копировать вход во временную переменную. В предыдущем примере вход A
передается ссылкой в сгенерированном коде, потому что это также действует как вывод для функционального foo
:
... /* Function Definitions */ void foo(double *A, double B) { *A *= B; } ...
Оптимизация параметра ссылки уменьшает использование памяти и время выполнения, особенно когда переменная, переданная ссылкой, является большой структурой данных. Чтобы достигнуть этих преимуществ на сайте вызова, вызовите функцию с той же переменной как оба ввода и вывода.
В отличие от этого, предположите, что вы переписываете функциональный foo
без оптимизации:
function y = foo2( A, B ) %#codegen y = A * B; end
Сгенерированный код передает входные параметры значением и возвращает значение вывода:
... /* Function Definitions */ double foo2(double A, double B) { return A * B; } ...
В некоторых случаях вывод функции не может быть измененной версией своих входных параметров. Если вы не используете входные параметры позже в функции, можно изменить код, чтобы работать с входными параметрами вместо на копии входных параметров. Один метод должен создать дополнительные возвращаемые значения для функции. Например, рассмотрите код:
function [y1,u1]=foo(u1) %#codegen x1=u1+1; y1=bar(x1); end function y2=bar(u2) % This line prevents a compiler optimization for % the sake of example coder.inline('never'); % Since foo does not use u2 later in the function, % it would be optimal to do this operation in place x2=u2.*2; % The change in dimensions in the following code % means that it cannot be done in place y2=[x2,x2]; end
Можно изменить код, чтобы устранить избыточные копии.
function [y1,u1]=foo(u1) %#codegen u1=u1+1; [y1,u1]=bar(u1); end function [y2,u2]=bar(u2) % This line prevents a compiler optimization for % the sake of example coder.inline('never'); u2=u2.*2; % The change in dimensions in the following code % still means that it cannot be done in place y2=[u2,u2]; end
Оптимизация параметра ссылки не применяется к постоянным входным параметрам. Если та же переменная является входом и выводом, и вход является постоянным, генератор кода обрабатывает вывод как отдельную переменную. Например, рассмотрите функциональный foo
:
function A = foo( A, B ) %#codegen A = A * B; end
Сгенерируйте код, в котором A
имеет постоянное значение 2
.
codegen -config:lib foo -args {coder.Constant(2) 3} -report
Сгенерированный код задает постоянный A
и возвращает значение вывода.
... #define A (2.0) ... double foo(double B) { return A * B; } ...