ブロック出力時の中間結果の計算と保存の最小化
式の畳み込み
"式の畳み込み" では、コードを最適化して、ブロック出力での中間結果の計算や、そのような中間結果の一時的なバッファーや変数への保存を最小にします。式の畳み込みがオンのときは、モデル内の個々のブロックに対して別々のコード ステートメントとストレージ宣言を行う代わりに、コード ジェネレーターはブロック演算を単一の式に折り畳み (畳み込み) ます。式の畳み込みは、ほとんどの Simulink® ブロックでサポートされています。
式の畳み込みは生成コードの効率を高めるため、手動で最適化されたコードに勝る結果を達成することもしばしばあります。多くの場合、モデル計算のすべてのグループを高度に最適化された 1 行のコードに収められます。
独自のインライン S-Function ブロックで式の畳み込みを使用できます。詳細については、式の畳み込みをサポートする S-Functionを参照してください。
モデル例
コードの生成
式の畳み込みがオフのときは、explfld.c
ファイル内に、コード ジェネレーターが以下のコードを生成します。
/* Model step function */ void exprfld_step(void) { /* Gain: '<Root>/Gain' incorporates: * Inport: '<Root>/In1' */ exprfld_B.S1 = exprfld_P.Gain_Gain * exprfld_U.i1; /* Gain: '<Root>/Gain1' incorporates: * Inport: '<Root>/In2' */ exprfld_B.S2 = exprfld_P.Gain1_Gain * exprfld_U.i2; /* Outport: '<Root>/Out1' incorporates: * Product: '<Root>/Product' */ exprfld_Y.Out1 = exprfld_B.S1 * exprfld_B.S2; }
両方の Gain ブロックについて別々のコード ステートメントがあります。最終出力の前に、これらのコード ステートメントによって Gain ブロックに対する一時的な結果が計算されます。
最適化の有効化
既定の設定では、式の畳み込みはオンになっています。既存のモデルで式の畳み込みがオンになっているかどうか確認するには、次の手順に従います。
式の畳み込みは、ローカル変数を含む式に対してのみ作用するため、[コンフィギュレーション パラメーター] 、 [信号ストレージの再利用] パラメーターがオンになっている場合にのみ使用できます。[信号ストレージの再利用] パラメーターを有効にします。
[信号ストレージの再利用] を選択すると、既定の設定で [ローカルなブロックの出力を有効にする]、[ローカル ブロック出力の再利用] および [余分なローカル変数の削除 (式の畳み込み)] パラメーターがすべてオンになります。
最適化を使用したコードの生成
式の畳み込みを使用すると、コード ジェネレーターは expfld.c
ファイルに示すように 1 行の出力演算を生成します。生成されたコメントには式に現れるブロック パラメーターが記載されています。
/* Model step function */ void exprfld_step(void) { /* Outport: '<Root>/Out1' incorporates: * Gain: '<Root>/Gain' * Gain: '<Root>/Gain1' * Inport: '<Root>/In1' * Inport: '<Root>/In2' * Product: '<Root>/Product' */ exprfld_Y.Out1 = exprfld_P.Gain_Gain * exprfld_U.i1 * (exprfld_P.Gain1_Gain * exprfld_U.i2); }
参考
信号ストレージの再利用 | ローカル ブロック出力の再利用 | ローカルなブロックの出力を有効にする | 余分なローカル変数の削除 (式の畳み込み)