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