coder.unroll
展开为
-loop通过在每次循环迭代时复制循环体
语法
coder.unroll ()
coder.unroll(国旗)
为我
= coder.unroll (范围
)
为我
= coder.unroll (范围
国旗)
描述
coder.unroll ()
打开一个为
循环。的coder.unroll
呼叫必须在其前面的一条线路上为
-循环,它展开。
而不是产生为
在生成的代码中-循环,循环展开生成为
-每次循环迭代的循环体。在每次迭代中,循环索引都保持不变。要展开循环,代码生成器必须能够确定的边界对- - - - - -
循环。
对于小而紧的循环,展开可以提高性能。然而,对于大型循环,展开会显著增加代码生成时间,并生成效率低下的代码。
coder.unroll
在代码生成之外被忽略。
为
遗留语法生成的代码是否与我
= coder.unroll (范围
)coder.unroll ()
.
例子
展开一个为
循环
制作…的副本为
循环体中生成的代码,使用coder.unroll
.
在一个文件中,编写入口点函数call_getrand
还有一个局部函数getrand
.getrand
打开一个为
将随机数分配给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循环中指向可变值或可变值的非常量索引.