Устраните избыточные копии входных параметров функции

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

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;
}
...

Похожие темы