ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

coder.unroll

パッケージ: coder

for ループの本体を各反復の生成コードにコピー

構文

for i = coder.unroll(range)
for i = coder.unroll(range,flag)

説明

for i = coder.unroll(range) は、for ループの本体を range の範囲で指定された各反復の生成コードにコピーします (for ループを展開)。i はループ カウンター変数です。

flagtrue の場合、for i = coder.unroll(range,flag)range で指定されているように for ループを展開します。

coder.unrollfor ループ ヘッダーで使用しなければなりません。coder.unroll は生成コードに変更を加えますが、計算結果には影響を与えません。

coder.unroll はコンパイル時に for ループの範囲を評価できなければなりません。反復数は 1,024 回を超えることはできません。大きいループを展開するとコンパイル時間が大幅に増加し、非効率的なコードが生成されます。

コード生成以外の場合、この関数は無視されます。

入力引数

flag

for ループを展開するかどうかを示すブール式です。

truefor ループを展開する
falsefor ループを展開しない

range

for ループ反復の範囲を指定します。

init_val : end_val1 のインクリメントを使用して、init_val から end_val まで反復する
init_val : step_val : end_valstep_val を正の場合はインクリメント、負の場合はデクリメントとして使用し、init_val から end_val まで反復する
行列変数行列の列数と同じ回数分、反復する

生成コードで for ループの本体をコピーする回数を制限するには、次の手順に従います。

  1. for ループを使用して長さ n のベクトルを生成し、乱数を特定の要素に代入する MATLAB® 関数 getrand(n) を作成します。テスト関数 test_unroll を追加します。この関数では、生成コードで for ループのコピーのしきい値よりも小さい値と大きい値の両方を n で指定して getrand(n) を呼び出します。

    function [y1, y2] = test_unroll() %#codegen
    % The directive %#codegen indicates that the function
    % is intended for code generation
      % Calling getrand 8 times triggers unroll
      y1 = getrand(8);
      % Calling getrand 50 times does not trigger unroll
      y2 = getrand(50);
     
    function y = getrand(n)
      % Turn off inlining to make 
      % generated code easier to read
      coder.inline('never');
    
      % Set flag variable dounroll to repeat loop body
      % only for fewer than 10 iterations
      dounroll = n < 10;
      % Declare size, class, and complexity
      % of variable y by assignment
      y = zeros(n, 1);
      % Loop body begins
      for i = coder.unroll(1:2:n, dounroll)
          if (i > 2) && (i < n-2) 
              y(i) = rand();
          end;
      end;
      % Loop body ends
  2. 既定の出力フォルダー codegen/lib/test_unroll で、test_unroll の C スタティック ライブラリ コードを生成します。

    codegen -config:lib test_unroll

    test_unroll.cgetrand(8) の生成 C コードは、反復回数が 10 回未満なので、for ループの本体を繰り返します (ループを展開します)。

    static void getrand(double y[8])
    {
      /*  Turn off inlining to make  */
      /*  generated code easier to read */
      /*  Set flag variable dounroll to repeat loop body */
      /*  only for fewer than 10 iterations */
      /*  Declare size, class, and complexity */
      /*  of variable y by assignment */
      memset(&y[0], 0, sizeof(double) << 3);
    
      /*  Loop body begins */
      y[2] = b_rand();
      y[4] = b_rand();
    
      /*  Loop body ends */
    }
    

    getrand(50) の生成 C コードは、反復回数が 10 回を超えるため、for ループを展開しません。

    static void b_getrand(double y[50])
    {
      int i;
      int b_i;
    
      /*  Turn off inlining to make  */
      /*  generated code easier to read */
      /*  Set flag variable dounroll to repeat loop body */
      /*  only for fewer than 10 iterations */
      /*  Declare size, class, and complexity */
      /*  of variable y by assignment */
      memset(&y[0], 0, 50U * sizeof(double));
    
      /*  Loop body begins */
      for (i = 0; i < 25; i++) {
        b_i = (i << 1) + 1;
        if ((b_i > 2) && (b_i < 48)) {
          y[b_i - 1] = b_rand();
        }
      }
    

この情報は役に立ちましたか?