Main Content

非有限数のチェックまたは数学関数のインライン化の無効化

コード ジェネレーターが数学関数のコードを生成する場合、次が適用されます。

  • モデルの [サポート: 非有限数] オプションが選択されている場合、数学関数に対して非有限数チェックが一様に生成されます。一部の関数に対しては非有限数チェックが生成され、他の関数に対しては生成されないように指定することはできません。

  • 既定の設定では、インライン化は数学関数に対して一様に適用されます。一部の関数に対してはインライン化が生成され、別の関数に対しては呼び出しが生成されるように指定することはできません。

コード置換ライブラリ (CRL) カスタマイズ エントリを使用すると、次のことができます。

  • 数学関数の非有限数チェックを選択的に無効化します。これにより、生成コードの実行速度を改善できます。

  • 数学関数のインライン化を選択的に無効化します。これにより、コードが読みやすくなり、コード サイズを縮小できます。

これらのカスタマイズがサポートされる関数には、次のものが含まれます。

  • 浮動小数点のみ: atan2copysignfixhypotloglog10roundsincos および sqrt

  • 浮動小数点および整数:absmaxminmodremsaturate、および sign

非有限数のチェックやインライン化を無効にするための一般的なワークフローは次のとおりです。

  1. 特定の数学関数に対する非有限数のチェックを無効にできる場合、または特定の関数に対してインライン化を無効にして代わりに関数呼び出しを生成する場合、次の MATLAB® 関数コードを、たとえば crl_table_customization.m など、.m というファイル名拡張子をもつ MATLAB ファイルにコピーします。

    function hTable = crl_table_customization
        
    % Create an instance of the Code Replacement Library table for controlling
    % function intrinsic inlining and nonfinite support
    
    hTable = RTW.TflTable;
    
    % Inline - true (if function needs to be inline)
    %          false (if function should not be inlined)
    % SNF (support nonfinite) - ENABLE (if non-finite checking should be performed)
    %                           DISABLE (if non-finite checking should NOT be performed)
    %                           UNSPECIFIED (Default behavior)
    
    % registerCustomizationEntry(hTable, ...
    %       Priority, numInputs, key, inType, outType, Inline, SNF);
    
    registerCustomizationEntry(hTable, ...
            100, 2, 'atan2', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'atan2', 'single', 'single', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'sincos', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sincos', 'single', 'single', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'double', 'double', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'single', 'single', true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'int32',  'int32',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'int16',  'int16',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'int8',   'int8',   true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'integer','integer',true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'uint32', 'uint32', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'uint16', 'uint16', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'uint8',  'uint8',  true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 2, 'hypot', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'hypot', 'single', 'single', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'log', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'log', 'single', 'double', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'log10', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'log10', 'single', 'double', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'double', 'double', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'single', 'single', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'int32',  'int32',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'int16',  'int16',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'int8',   'int8',   true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'uint32', 'uint32', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'uint16', 'uint16', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'uint8',  'uint8',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'integer','integer',true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'double', 'double', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'single', 'single', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'int32',  'int32',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'int16',  'int16',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'int8',   'int8',   true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'uint32', 'uint32', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'uint16', 'uint16', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'uint8',  'uint8',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'integer','integer',true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'single', 'single', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'int32',  'int32',  false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'int16',  'int16',  false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'int8',   'int8',   false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'uint32', 'uint32', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'uint16', 'uint16', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'uint8',  'uint8',  false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'single', 'single', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'int32',  'int32',  false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'int16',  'int16',  false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'int8',   'int8',   false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'uint32', 'uint32', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'uint16', 'uint16', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'uint8',  'uint8',  false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'round', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'round', 'single', 'single', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'double', 'double', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'single', 'single', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'int32',  'int32',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'int16',  'int16',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'int8',   'int8',   true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'uint32', 'uint32', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'uint16', 'uint16', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'uint8',  'uint8',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'integer','integer',true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'double', 'double',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'single', 'single',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'int32',  'integer', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'int16',  'integer', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'int8',   'integer', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'uint32', 'uint32',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'uint16', 'uint16',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'uint8',  'uint8',   true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'integer','integer', true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'sqrt', 'double', 'double', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sqrt', 'single', 'single', true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'fix', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'fix', 'single', 'single', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'copysign', 'double', 'double', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'copysign', 'single', 'single', true, 'UNSPECIFIED');
  2. ファイルのサイズを縮小するには、既定の非有限数のチェックおよびインライン化の動作を許容する関数の registerCustomizationEntry 行を削除します。

  3. 残りの各エントリに対して、次のようにします。

    • 関数をインライン化する場合には Inline 引数を true に、インライン化しない場合は false に設定します。

    • 非有限数チェックを生成する場合は SNF 引数を ENABLE に、生成しない場合は DISABLE に設定します。または、モデルのオプション設定に基づいて既定の動作を受け入れる場合は、UNSPECIFIED に設定します。

    ファイルを保存します。

  4. オプションで、MATLAB のコマンド ライン (>> tbl = crl_table_customization) でテーブル定義ファイルを呼び出し、カスタマイズ テーブル エントリの構文の妥当性のクイック チェックを実行します。フラグの付いた構文エラーを修正します。

  5. オプションで、カスタマイズ テーブルのエントリをコード置換ビューアー (>> crviewer(crl_table_customization)) で表示します。コード置換テーブルの表示の詳細については、コード置換ライブラリの選択を参照してください。

  6. これらの変更を登録し、[コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成][インターフェイス] ペインにある [コード置換ライブラリ] ドロップダウン リストに表示するには、まず、次の MATLAB 関数コードをファイル rtwTargetInfo.m のインスタンスにコピーします。

    メモ

    以下に示す例については、GRT ターゲットがモデルに対して選択されている場合に引数 'RTW' を指定します。選択されていない場合は引数を省略します。

    function rtwTargetInfo(cm)
    % rtwTargetInfo function to register a code replacement library (CRL)
    
      % Register the CRL defined in local function locCrlRegFcn
      cm.registerTargetInfo(@locCrlRegFcn);
    
    end % End of RTWTARGETINFO
    
    
    % Local function to define a CRL containing crl_table_customization
    function thisCrl = locCrlRegFcn
    
      % Instantiate a CRL registry entry - specify 'RTW' for GRT
      thisCrl = RTW.TflRegistry('RTW');
    
      % Define the CRL properties
      thisCrl.Name = 'CRL Customization Example';
      thisCrl.Description = 'Example  of CRL Customization';
      thisCrl.TableList = {'crl_table_customization'};
      thisCrl.TargetHWDeviceType = {'*'};
      
    end % End of LOCCRLREGFCN

    Name フィールドを編集して [コード置換ライブラリ] ドロップダウン リストに表示されるライブラリ名を指定します。また、TableList フィールドのファイル名は、手順 1 で作成したファイルの名前と一致していなければなりません。

    MATLAB パスに今回作成した両方の MATLAB ファイルを使用して変更を登録するには、MATLAB コマンド ラインで次のコマンドを入力します。

    sl_refresh_customizations
  7. 非有限数のチェックまたはインライン化の動作を指定した数学関数の 1 つに対応する関数コードを生成するモデルを作成するか、開きます。

  8. [コンフィギュレーション パラメーター] ダイアログ ボックスを開いて [コード生成][インターフェイス] ペインに移動し、[コード置換ライブラリ] ドロップダウン リストを使用して手順 6 で登録したコード置換エントリ、たとえば CRL Customization Example を選択します。

  9. モデルに対してコードを生成し、数学関数が予想どおりに生成されているかどうか、生成コードを検証します。