このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
範囲外の浮動小数点を整数へ変換するコードの削除
この例では、範囲外の浮動小数点を整数に変換するコードを削除することで、最適化されたコードを生成する方法を説明します。標準 C は範囲外の浮動小数点から整数への変換の動作を定義しませんが、これらの変換はシミュレーション中に適切に定義されます。コンフィギュレーション パラメーター [範囲外の値をラップする浮動小数点から整数への変換コードを削除] を選択すると、コード ジェネレーターは範囲外の浮動小数点から整数への変換を処理するラッピング コードを削除して、コードの効率を改善します。このコードを使用しない場合、範囲外の値に対するシミュレーションとコード生成の結果の間に不一致が生じる可能性があります。
アプリケーションにおける入力値が出力型の範囲にある場合、範囲外の浮動小数点から整数への変換コードを削除します。このコードを削除すると、生成されたコードのサイズが縮小し、処理が高速化します。
モデル例
モデル例 FloatMultiplicationNetSlope
を開きます。
model = 'FloatMultiplicationNetSlope';
open_system(model);
モデルには Data Type Conversion ブロックが含まれます。入力信号を single
から uint8
に変換するようにモデルを設定するには、[データ型の変換] ダイアログ ボックスを開きます。[出力データ型] パラメーターに対し、uint8
を選択します。あるいは、以下のようにコマンド ライン API を使用して、[出力データ型] を設定します。
set_param('FloatMultiplicationNetSlope/Data Type Conversion', 'OutDataTypeStr','uint8');
uint8 は 0 から 255 までの値をサポートできます。入力信号にこの範囲外の値がある場合、範囲外の変換が行われます。
最適化を使用しないコードの生成
1. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[最適化] ペインで、[範囲外の値をラップする浮動小数点から整数への変換コードを削除] パラメーター チェック ボックスをオフにします。あるいは、コマンド ライン API を使用して最適化を無効にします。
set_param(model, 'EfficientFloat2IntCast','off');
2. 関数 slbuild
を使用するか、"Ctrl+B" を押して、モデルをビルドします。
slbuild(model)
### Starting build procedure for: FloatMultiplicationNetSlope ### Successful completion of build procedure for: FloatMultiplicationNetSlope Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================================================= FloatMultiplicationNetSlope Code generated and compiled. Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 9.6025s
3. FloatMultiplicationNetSlope.c
内に生成されたステップ関数 FloatMultiplicationNetSlope_step
を検査します。
file = fullfile('FloatMultiplicationNetSlope_grt_rtw','FloatMultiplicationNetSlope.c'); coder.example.extractLines(file,'/* Model step function */','/* Model initialize function',1,1);
/* Model step function */ void FloatMultiplicationNetSlope_step(void) { real32_T tmp; /* DataTypeConversion: '<Root>/Data Type Conversion' incorporates: * Inport: '<Root>/Input' */ tmp = (real32_T)floor(FloatMultiplicationNetSlope_U.Input); if (rtIsNaNF(tmp) || rtIsInfF(tmp)) { tmp = 0.0F; } else { tmp = (real32_T)fmod(tmp, 256.0); } if (tmp < 0.0F) { /* Outport: '<Root>/Output' */ FloatMultiplicationNetSlope_Y.Output = (uint8_T)-(int8_T)(uint8_T)-tmp; } else { /* Outport: '<Root>/Output' */ FloatMultiplicationNetSlope_Y.Output = (uint8_T)tmp; } /* End of DataTypeConversion: '<Root>/Data Type Conversion' */ }
コード ジェネレーターは、範囲外の結果を処理するために、関数 fmod
を適用します。この場合、生成されたコードは大きくなりますが、生成されたコードの結果はシミュレーション結果と一致します。
最適化を使用したコードの生成
1. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[最適化] ペインで、[範囲外の値をラップする浮動小数点から整数への変換コードを削除] パラメーターを選択します。あるいは、コマンド ライン API を使用して最適化を有効にします。
set_param(model, 'EfficientFloat2IntCast','on')
2. モデルを作成します。FloatMultiplicationNetSlope.c
内で、最適化を使用して生成されたステップ関数 FloatMultiplicationNetSlope_step
を検査します。
slbuild(model); file = fullfile('FloatMultiplicationNetSlope_grt_rtw','FloatMultiplicationNetSlope.c'); coder.example.extractLines(file,'/* Model step function */','/* Model initialize function',1,1);
### Starting build procedure for: FloatMultiplicationNetSlope ### Successful completion of build procedure for: FloatMultiplicationNetSlope Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================================ FloatMultiplicationNetSlope Code generated and compiled. Generated code was out of date. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 7.3637s /* Model step function */ void FloatMultiplicationNetSlope_step(void) { /* Outport: '<Root>/Output' incorporates: * DataTypeConversion: '<Root>/Data Type Conversion' * Inport: '<Root>/Input' */ FloatMultiplicationNetSlope_Y.Output = (uint8_T) FloatMultiplicationNetSlope_U.Input; }
生成されたコードは保護コードを使用しない方が効率的ですが、生成されたコードを実行しても 0 から 255 の範囲にない値に対するシミュレーションと同じ結果が得られない可能性があります。
例のフォルダーおよびファイルのクリーン アップ
モデルを閉じて、一時フォルダーおよびファイルを削除します。
bdclose(model);
参考
範囲外の値をラップする浮動小数点から整数への変換コードを削除