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.

Введенный в R2011a