ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

coder.unroll

パッケージ: coder

生成コード内で for ループの本体を反復ごとにコピー

構文

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

説明

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

flagtrue の場合、for i = coder.unroll(range,flag)for ループを range で指定されたとおりに展開します。

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

coder.unroll は、コンパイル時に for ループの範囲を評価できなければなりません。反復回数は 1024 を超えることはできません。大規模なループの展開は、コンパイル時間を大幅に増やし、効率の悪いコードが生成される可能性があります。

コード生成の範囲外では、この関数は無視されます。

入力引数

flag

for ループを展開するかどうかを示す論理式。

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

range

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

init_val : end_val1 の増分で init_val から end_val まで反復
init_val : step_val : end_val正の場合は増分、負の場合は減分として step_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();
        }
      }
    

参考

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