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

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

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=foo(u1) %#codegen
  x1=u1+1;
  y1=bar(x1);
end

function y2=bar(u2)
  % Since foo does not use x1 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=foo(u1) %#codegen
  u1=u1+1;
  [y1, u1]=bar(u1);
end

function [y2, u2]=bar(u2)
    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;
}
...

Похожие темы