このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
ベクトル演算の最適化
この例では、Simulink® Coder™ を使用してベクトルからスカラーを生成するブロック出力を設定することにより、Mux、Sum、Gain および Bus などのブロックに対して生成コードを最適化する方法を示します。この最適化により、一時ローカル配列がローカル変数に置き換わりスタック メモリが削減されます。
モデル例
モデル rtwdemo_VectorOptimization では、Gain ブロック G1
と G2
の出力はベクトル信号 tmp1
と tmp2
です。これらのベクトルの幅は 10 です。
model = 'rtwdemo_VectorOptimization'; open_system(model); set_param(model, 'SimulationCommand', 'update')
コードの生成
ビルドと検査プロセス用に一時フォルダー (システムの一時フォルダー内) を作成します。
currentDir = pwd; [~,cgDir] = rtwdemodir();
モデルを作成します。
slbuild(model)
### Starting build procedure for: rtwdemo_VectorOptimization ### Successful completion of build procedure for: rtwdemo_VectorOptimization Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================================================ rtwdemo_VectorOptimization 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 10.252s
最適化されたコードは rtwdemo_VectorOptimization.c
にあります。信号 tmp1
と tmp2
はローカル変数 rtb_tmp1
と rtb_tmp2
です。
cfile = fullfile(cgDir,'rtwdemo_VectorOptimization_grt_rtw',... 'rtwdemo_VectorOptimization.c'); rtwdemodbtype(cfile,'/* Model step', '/* Model initialize', 1, 0);
/* Model step function */ void rtwdemo_VectorOptimization_step(void) { real_T rtb_Sum3_j; real_T rtb_tmp1_a; real_T rtb_tmp2_j; int32_T i; for (i = 0; i < 10; i++) { /* Gain: '<Root>/G2' incorporates: * UnitDelay: '<Root>/X2' */ rtb_tmp2_j = 0.3 * rtwdemo_VectorOptimization_DW.X2_DSTATE[i]; /* Gain: '<Root>/G1' incorporates: * UnitDelay: '<Root>/X1' */ rtb_tmp1_a = 0.2 * rtwdemo_VectorOptimization_DW.X1_DSTATE[i]; /* Sum: '<Root>/Sum3' incorporates: * Gain: '<Root>/G3' * Inport: '<Root>/In2' * Sum: '<Root>/Sum1' * Sum: '<Root>/Sum2' * UnitDelay: '<Root>/X3' */ rtb_Sum3_j = ((rtwdemo_VectorOptimization_U.In2[i] - 0.4 * rtwdemo_VectorOptimization_DW.X3_DSTATE[i]) - rtb_tmp2_j) - rtb_tmp1_a; /* Outport: '<Root>/Out2' */ rtwdemo_VectorOptimization_Y.Out2[i] = rtb_Sum3_j; /* Update for UnitDelay: '<Root>/X3' */ rtwdemo_VectorOptimization_DW.X3_DSTATE[i] = rtb_tmp2_j; /* Update for UnitDelay: '<Root>/X2' */ rtwdemo_VectorOptimization_DW.X2_DSTATE[i] = rtb_tmp1_a; /* Update for UnitDelay: '<Root>/X1' */ rtwdemo_VectorOptimization_DW.X1_DSTATE[i] = rtb_Sum3_j; } }
モデルおよびコード生成レポートを閉じます。
bdclose(model) rtwdemoclean; cd(currentDir)