exponenta event banner

Развернуть 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

См. также

Связанные темы