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

参考

関連するトピック