主要内容

coder.unroll

展开复制循环的循环体为每个循环迭代

描述

例子

coder.unroll ()打开一个循环。的coder.unroll电话前必须立即在一行本身循环铺。

而不是生产循环在生成的代码中,循环展开产生的一个副本为每个循环迭代循环体。在每个迭代中,循环指数成为常数。展开一个循环,代码生成器必须能够确定的界限对- - - - - -循环。

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

coder.unroll忽略之外的代码生成。

例子

coder.unroll (国旗)打开一个循环如果国旗真正的国旗代码生成次评估。的coder.unroll电话前必须立即在一行本身循环铺。

例子

全部折叠

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

在一个文件中,写的入口点函数call_getrand和当地的功能getrandgetrand打开一个循环分配随机数字n×1数组。call_getrand调用getrand值3。

函数z = call_getrand% # codegenz = getrand (3);结束函数y = getrand (n) coder.inline (“永远”);y = 0 (n, 1);coder.unroll ();i = 1: n y (i) = rand ();结束结束

生成一个静态库。

codegen配置:自由call_getrand报告

在生成的代码,代码生成器产生的一个副本三个循环的循环体为每个迭代。

静态孔隙getrand(双y [3]) {y [0] = b_rand ();y [1] = b_rand ();y [2] = b_rand ();}

通过使用控制循环展开coder.unroll国旗论点。

在一个文件中,写的入口点函数call_getrand_unrollflag和当地的功能getrand_unrollflag。当循环迭代的数量小于10,getrand_unrollflag铺的循环。call_getrand调用getrand值50。

函数z = call_getrand_unrollflag% # codegenz = getrand_unrollflag (50);结束函数y = getrand_unrollflag (n) coder.inline (“永远”);unrollflag = n < 10;y = 0 (n, 1);coder.unroll (unrollflag)i = 1: n y (i) = rand ();结束结束

生成一个静态库。

codegen配置:自由call_getrand_unrollflag报告
静态孔隙getrand_unrollflag(双y [50]) {int我;(我= 0;我< 50;我+ +){y[我]= b_rand ();}}

迭代的次数不小于10。因此,代码生成器不展开循环。它产生一个循环在生成的代码。

  • 函数z = call_getrand% # codegenz = getrand (3);结束函数y = getrand (n) coder.inline (“永远”);y = 0 (n, 1);i = coder.unroll (1: n) y (i) = rand ();结束结束
  • 函数z = call_getrand_unrollflag% # codegenz = getrand_unrollflag (50);结束函数y = getrand_unrollflag (n) coder.inline (“永远”);unrollflag = n < 10;y = 0 (n, 1);我=编码器。展开(1:n, unrollflag) y (i) = rand ();结束结束

输入参数

全部折叠

国旗真正的代码生成器铺循环。当国旗代码生成器生成循环在生成的代码。国旗代码生成次评估。

提示

  • 有时,代码生成器铺循环,即使你不使用coder.unroll。例如,如果一个变成一个异构单元阵列或循环索引变长度输入宗量varargout代码生成器铺循环。通过展开循环,代码生成器可以确定为每个循环迭代索引的值。代码生成器使用启发式来确定何时展开循环。如果展开的启发式无法识别是有效的,或者循环迭代的数量超过限制,代码生成失败。在这些情况下,您可以通过使用强迫循环展开coder.unroll。看到非常数的指数变长度输入宗量或varargout for循环

  • 如果一个循环不是之前coder.unroll,代码生成器使用循环展开阈值来确定是否自动展开循环。如果循环迭代的数量小于阈值,代码生成器铺循环。如果迭代次数大于或等于阈值,代码生成器生成循环。默认值的阈值5。通过修改这个阈值,你可以调整循环展开。更多细节,请参阅展开for循环和parfor-Loops

扩展功能

C / c++代码生成
生成C和c++代码使用MATLAB®编码器™。

GPU的代码生成
生成NVIDIA的CUDA®代码®GPU使用GPU编码器™。

版本历史

介绍了R2011a