for- ПетлиКогда генератор кода разворачивает for-loop, вместо создания for-контур в сгенерированном коде создает копию тела цикла для каждой итерации. Для небольших замкнутых контуров разворачивание может повысить производительность. Однако для больших циклов разворачивание может значительно увеличить время генерации кода и генерировать неэффективный код.
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:
z[0] = 6.0; z[1] = 7.0; z[2] = 8.0; z[3] = 9.0; z[4] = 10.0;
Управление при for-loop не развернут, используйте 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-loop, генератор кода должен иметь возможность определять границы for-луп. Например, не удалось создать код для следующего кода, поскольку значение n неизвестен во время генерации кода.
function b = myloop(n) b = zeros(1,n); coder.unroll(); for i = 1:n b(i)=i+n; end end