Разблокируйте for- Циклы

Когда генератор кода разворачивает for-цикл, вместо создания for-loop в сгенерированном коде, он создает копию тела цикла для каждой итерации. Для небольших плотных циклов размотка может улучшить эффективность. Однако для больших циклов развертывание может значительно увеличить время генерации кода и сгенерировать неэффективный код.

Цикл силы при помощи coder.unroll

Генератор кода использует эвристику, чтобы определить, когда развернуть for-цикл. Чтобы принудительно разворачивать цикл, используйте coder.unroll. Это влияет только на for цикл, который сразу после coder.unroll. Для примера:

function z = call_myloop()
%#codegen
z = myloop(5);
end

function b = myloop(n)
b = zeros(1,n);
coder.unroll();
for i = 1:n
    b(i)=i+n;
end
end

Вот сгенерированный код для for-loop:

  z[0] = 6.0;
  z[1] = 7.0;
  z[2] = 8.0;
  z[3] = 9.0;
  z[4] = 10.0;

Для управления, когда a for-цикл разворачивается, используйте coder.unroll flag аргумент. Для примера разверните цикл только, когда количество итераций меньше 10.

function z = call_myloop()
%#codegen
z = myloop(5);
end

function b = myloop(n)
unroll_flag = n < 10;
b = zeros(1,n);
coder.unroll(unroll_flag);
for i = 1:n
    b(i)=i+n;
end
end

Чтобы развернуть for-цикл, генератор кода должен быть в состоянии определять границы for-цикл. Для примера генерация кода прекращается для следующего кода, потому что значение n не известно во время генерации кода.

function b = myloop(n)
b = zeros(1,n);
coder.unroll();
for i = 1:n
    b(i)=i+n;
end
end

См. также

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте