Можно уменьшить количество копий в сгенерированном коде, написав функции, которые используют ту же переменную, что и вход, и выход. Для примера:
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; } ...