Разверните for - циклы

Когда генератор кода разворачивает for - цикл, вместо того, чтобы произвести 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 - цикл будет развернут, используйте аргумент 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

Смотрите также

Похожие темы