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