Main Content

coder.unroll

通过为每次循环迭代生成循环体的副本来展开 for 循环

说明

示例

coder.unroll() 展开 for 循环。coder.unroll 调用必须单独位于紧挨它展开的 for 循环之前的一行上。

循环展开并不在生成的代码中产生 for 循环,而是为每个循环迭代生成 for 循环体的一个副本。在每次迭代中,循环索引变为常量。要展开循环,代码生成器必须能够确定 for- 循环的边界。

对于紧凑的小型循环,展开可以提高性能。然而,对于大型循环,展开会显著增加代码生成时间并生成效率低下的代码。

在代码生成期间外,系统会忽略 coder.unroll

示例

如果 flagtrue,则 coder.unroll(flag) 展开 for 循环。flag 在代码生成时计算。coder.unroll 调用必须单独位于紧挨它展开的 for 循环之前的一行上。

示例

全部折叠

要在生成的代码中生成 for 循环体的副本,请使用 coder.unroll

在一个文件中,编写入口函数 call_getrand 和一个局部函数 getrandgetrand 展开一个向 n×1 数组分配随机数的 for 循环。call_getrand 使用值 3 调用 getrand

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();
}

通过将 coder.unrollflag 参数结合使用,控制循环展开。

在一个文件中,编写入口函数 call_getrand_unrollflag 和一个局部函数 getrand_unrollflag。当循环迭代次数小于 10 时,getrand_unrollflag 展开 for 循环。call_getrand 使用值 50 调用 getrand

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
static void getrand_unrollflag(double y[50])
{
  int i;
  for (i = 0; i < 50; i++) {
    y[i] = b_rand();
  }
}

迭代次数不小于 10。因此,代码生成器不会展开 for 循环。它在生成的代码中产生一个 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
  • 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

输入参数

全部折叠

flagtrue 时,代码生成器展开 for 循环。当 flagfalse 时,代码生成器会在生成的代码中产生 for 循环。flag 在代码生成时计算。

提示

  • 有时,即使您不使用 coder.unroll,代码生成器也会展开 for 循环。例如,如果 for 循环对异构元胞数组或者 vararginvarargout 进行索引,代码生成器将展开该循环。通过展开循环,代码生成器可以确定每个循环迭代的索引值。代码生成器使用启发式方法来确定何时展开 for 循环。如果启发式方法无法确定是否一定会展开循环,或如果循环迭代的次数超过限制,代码生成就会失败。在这些情况下,您可以使用 coder.unroll 强制进行循环展开。请参阅Nonconstant Index into varargin or varargout in a for-Loop

扩展功能

C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。

GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。

版本历史记录

在 R2011a 中推出