for- Циклы и parfor- ЦиклыКогда генератор кода разворачивает a for- цикл или parfor- цикл, вместо того, чтобы произвести цикл в сгенерированном коде, это производит копию тела цикла для каждой итерации. Для маленьких, жестких циклов разворачивание может улучшать производительность. Однако для больших циклов, разворачивание может значительно увеличить время генерации кода и сгенерировать неэффективный код.
for- Развертывание цикла при помощи coder.unroll Генератор кода использует эвристику, чтобы определить, когда развернуть a 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;
Управлять когда 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
Разворачивать a for- цикл, генератор кода должен смочь определить границы for- цикл. Например, генерация кода перестала работать для следующего кода потому что значение n не известен во время генерации кода.
function b = myloop(n) b = zeros(1,n); coder.unroll(); for i = 1:n b(i)=i+n; end end