文档

coder.unroll

展开-loop通过在每次循环迭代时复制循环体

语法

coder.unroll ()
coder.unroll(国旗)
= coder.unroll (范围
= coder.unroll (范围国旗)

描述

例子

coder.unroll ()打开一个循环。的coder.unroll呼叫必须在其前面的一条线路上-循环,它展开。

而不是产生在生成的代码中-循环,循环展开生成-每次循环迭代的循环体。在每次迭代中,循环索引都保持不变。要展开循环,代码生成器必须能够确定的边界对- - - - - -循环。

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

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

例子

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报告

在生成的代码中,代码生成器生成-循环体,用于三个循环迭代中的每一个。

静态无效gettrand(双y[3]) {y[0] = b_rand();Y bb0 = b_rand();Y bb0 = b_rand();}

控制-loop Unrolling with Flag

控制循环展开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报告

迭代次数不少于10次。因此,代码生成器不会展开循环。它产生了-循环生成的代码。

静态void getrand_unrollflag(double y[50]) {int i;For (i = 0;I < 50;I ++) {y[I] = b_rand();}}

使用遗留语法展开循环

函数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);I =编码员。Unroll (1:n, unrollflag) y(i) = rand();结束结束

输入参数

全部折叠

国旗真正的,代码生成器展开循环。当国旗,代码生成器生成-循环生成的代码。国旗在代码生成时求值。

提示

有时,代码生成器展开-循环,即使你不使用coder.unroll.例如,如果a-loop索引到异构单元数组或到变长度输入宗量varargout,代码生成器展开循环。通过展开循环,代码生成器可以确定每个循环迭代的索引值。代码生成器使用启发式方法来确定何时展开循环。如果启发式方法不能确定展开是必要的,或者如果循环迭代的次数超过了限制,代码生成就会失败。在这些情况下,可以使用coder.unroll.看到在for循环中指向可变值或可变值的非常量索引

在R2011a中引入

这个话题有帮助吗?