coder.unroll

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

Синтаксис

coder.unroll()
coder.unroll(flag)

Описание

пример

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

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

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

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

пример

coder.unroll(flag) разворачивает for - цикл, если flag является true. flag оценен во время генерации кода. Вызов 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.

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

Введенный в R2011a

Была ли эта тема полезной?