Main Content

展开 for 循环和 parfor 循环

当代码生成器展开 for 循环或 parfor 循环时,它不会在生成的代码中生成循环,而是为每次迭代生成循环体的副本。对于紧凑的小型循环,展开可以提高性能。但是,对于大型循环,展开会显著增加代码生成时间并生成低效代码。

使用 coder.unroll 强制 for 循环展开

代码生成器使用启发式方法来确定何时展开 for 循环。要强制循环展开,请使用 coder.unroll。这只会影响紧接在 coder.unroll 后的 for 循环。例如:

function z = call_myloop()
%#codegen
z = myloop(5);
end

function b = myloop(n)
b = zeros(1,n);
coder.unroll();
for i = 1:n
    b(i)=i+n;
end
end

以下是为 for 循环生成的代码:

  z[0] = 6.0;
  z[1] = 7.0;
  z[2] = 8.0;
  z[3] = 9.0;
  z[4] = 10.0;

要控制 for 循环何时展开,请使用 coder.unroll flag 参量。例如,仅当迭代次数少于 10 次时才展开循环。

function z = call_myloop()
%#codegen
z = myloop(5);
end

function b = myloop(n)
unroll_flag = n < 10;
b = zeros(1,n);
coder.unroll(unroll_flag);
for i = 1:n
    b(i)=i+n;
end
end

要展开 for 循环,代码生成器必须能够确定 for 循环的边界。例如,以下代码的代码生成失败,因为在代码生成时 n 的值未知。

function b = myloop(n)
b = zeros(1,n);
coder.unroll();
for i = 1:n
    b(i)=i+n;
end
end

另请参阅

相关主题