coder.unroll

Разверните for- цикл путем создания копии тела цикла для каждой итерации цикла

Описание

пример

coder.unroll() разворачивает for- цикл. coder.unroll вызов должен быть на линии отдельно сразу предшествованием for- цикл, который это разворачивает.

Вместо того, чтобы произвести a for- цикл в сгенерированном коде, развертывание цикла производит копию for- тело цикла для каждой итерации цикла. В каждой итерации индекс цикла становится постоянным. Чтобы развернуть цикл, генератор кода должен смочь определить границы for-цикл.

Для маленьких, жестких циклов разворачивание может улучшать производительность. Однако для больших циклов, разворачивание может значительно увеличить время генерации кода и сгенерировать неэффективный код.

coder.unroll проигнорирован за пределами генерации кода.

пример

coder.unroll(flag) разворачивает for- цикл, если flag trueфлаг оценен во время генерации кода. coder.unroll вызов должен быть на линии отдельно сразу предшествованием for- цикл, который это разворачивает.

Примеры

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

Произвести копии for- тело цикла в сгенерированном коде, использовать coder.unroll.

В одном файле запишите функцию точки входа call_getrand и локальная функция getrand. getrand разворачивает for- цикл, который присваивает случайные числа n-1 массиву. call_getrand вызовы getrand со значением 3.

function z = call_getrand 
%#codegen
z = getrand(3);
end

function y = getrand(n)
coder.inline('never');
y = zeros(n, 1);
coder.unroll();
for i = 1:n
    y(i) = rand();
end
end

Сгенерируйте статическую библиотеку.

codegen -config:lib call_getrand -report

В сгенерированном коде генератор кода производит копию for- тело цикла для каждой из этих трех итераций цикла.

static void getrand(double y[3])
{
  y[0] = b_rand();
  y[1] = b_rand();
  y[2] = b_rand();
}

Управляйте for- развертывание цикла с флагом

Цикл управления, разворачивающий при помощи coder.unroll с flag аргумент.

В одном файле запишите функцию точки входа call_getrand_unrollflag и локальная функция getrand_unrollflag. Когда количество итераций цикла меньше 10, getrand_unrollflag разворачивает for- цикл. call_getrand вызовы getrand со значением 50.

function z = call_getrand_unrollflag
%#codegen
z = getrand_unrollflag(50);
end

function y = getrand_unrollflag(n)
coder.inline('never');
unrollflag = n < 10;
y = zeros(n, 1);
coder.unroll(unrollflag)
for i = 1:n
    y(i) = rand();
end
end

Сгенерируйте статическую библиотеку.

codegen -config:lib call_getrand_unrollflag -report

Количество итераций не меньше 10. Поэтому генератор кода не разворачивает for- цикл. Это производит for- цикл в сгенерированном коде.

static void getrand_unrollflag(double y[50])
{
  int i;
  for (i = 0; i < 50; i++) {
    y[i] = b_rand();
  }
}

Используйте традиционный синтаксис, чтобы развернуть for- Цикл

function z = call_getrand 
%#codegen
z = getrand(3);
end

function y = getrand(n)
coder.inline('never');
y = zeros(n, 1);
for i = coder.unroll(1:n)
    y(i) = rand();
end
end

Используйте традиционный синтаксис, чтобы управлять for- Развертывание цикла

function z = call_getrand_unrollflag
%#codegen
z = getrand_unrollflag(50);
end

function y = getrand_unrollflag(n)
coder.inline('never');
unrollflag = n < 10;
y = zeros(n, 1);
for i = coder.unroll(1:n, unrollflag)
    y(i) = rand();
end
end

Входные параметры

свернуть все

Когда flag true, генератор кода разворачивает for- цикл. Когда flag false, генератор кода производит for- цикл в сгенерированном коде. flag оценен во время генерации кода.

Советы

  • Иногда, генератор кода разворачивает for- цикл даже при том, что вы не используете coder.unroll. Например, если for- цикл индексирует в неоднородный массив ячеек или в varargin или varargout, генератор кода разворачивает цикл. Путем разворачивания цикла генератор кода может определить значение индекса для каждой итерации цикла. Генератор кода использует эвристику, чтобы определить, когда развернуть for- цикл. Если эвристике не удается идентифицировать, что разворачивание гарантировано, или если количество итераций цикла превышает предел, сбои генерации кода. В этих случаях можно обеспечить развертывание цикла при помощи coder.unroll. Смотрите Непостоянный индекс в varargin или varargout в цикле for.

  • Если a for- циклом не предшествуют coder.unroll, генератор кода использует порог развертывания цикла, чтобы определить, развернуть ли автоматически цикл. Если количество итераций цикла меньше порога, генератор кода разворачивает цикл. Если количество итераций больше или равно порогу, генератор кода производит for- цикл. Значением по умолчанию порога является 5. Путем изменения этого порога можно подстроить развертывание цикла. Для получения дополнительной информации смотрите, Разворачивают циклы for.

Введенный в R2011a