主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

関数memcpyを使用したベクトルの代入に対する生成コードの最適化

[ベクトルの割り当てに対してmemcpyを使用)パラメーターを使用して,ループを関数memcpyの呼び出しで置き換えることで,ベクトルの割り当ての生成コードを最適化できます。大規模なデータセットの場合,関数memcpyのほうがループ制御による要素割り当てよりも効率的です。この最適化によって実行速度が向上します。

[ベクトルの割り当てに対してmemcpyを使用)パラメーターを選択すると,関連パラメーター[memcpyしきい値(バイト))が有効になります。このパラメーターによって,関数memcpyの呼び出しで生成コードのループを置き換えるときの配列の最小サイズをバイト単位で指定できます。詳細については,ベクトルの割り当てに対してmemcpyを使用およびmemcpyしきい値(バイト)を参照してください。この最適化を使用するかどうかを決定する際,

  • ターゲットが関数memcpyをサポートすることを確認します。

  • たとえば选择ブロックの使用など,大量のデータを移動するためにモデルが信号ベクトルの割り当て(Y =表达式など)を使用するかどうかを判断します。

この最適化を適用するには,次のようにします。

  1. 最適化された割り当てを評価するためのベースラインを構築するために,最初にこの最適化なしでコードを生成して実行速度を測定することを検討します。

  2. [ベクトルの割り当てに対してmemcpyを使用)を選択し,[memcpyしきい値(バイト))の設定を検証します。この設定は,既定の設定では,関数memcpyの呼び出しでループを置き換えるときの配列の最小サイズは64バイトになっています。アプリケーションの信号ベクトルの割り当てで使用される配列サイズ、およびしきい値選択に影響を与えるターゲット環境の考慮事項に基づき、既定の設定をそのまま使用するか、別の配列サイズを指定します。

  3. コードを生成し,ベースラインまたは以前の反復に対する実行速度を測定します。最適な結果が得られるまで,手順2および3を反復します。

メモ

memcpyの最適化は特定の条件では発生しません。他の最適化のほうがmemcpyの最適化よりも優先順位が高い場合や,生成コードがs函数ブロックに関連付けられているTLCファイルなどの目标语言编译器(TLC)コードから生成されている場合などです。

メモ

嵌入式编码器®ソフトウェアのライセンスがある場合,コード置換ライブラリ(CRL)を使用して,生成モデルコードで使用するために関数memcpyの独自のカスタム実装を実現できます。詳細については,内存功能代码替换(嵌入式编码)を参照してください。

モデル例

[ベクトルの割り当てに対してmemcpyを使用)パラメーターの使用による生成ベクトル割り当てコードへの結果を調べるには,信号ベクトル割り当てを生成するモデルを作成します。以下に例を示します。

  1. ブロック,ブロックおよび选择器ブロックを使用して,次のモデルを作成します。

  2. モデルエクスプローラーを開き,三机一体およびIn2ソースブロックに対して[信号属性]を設定します。各ブロックについて,(端子の次元)[1100]に,[データ型)int32に設定します。変更を適用し,モデルを保存します。この例では,モデルの名前はvectorassignです。

  3. 各选择ブロックに対して,[インデックス]パラメーターを1:50に設定します。(入力の端子サイズ]パラメーターをOne hundred.に設定します。

コードの生成

  1. [ベクトルの割り当てに対してmemcpyを使用)パラメーターは,既定の設定でオンになっています。パラメーターをオフにするには,[最適化]ペインに移動して,[ベクトルの割り当てに対してmemcpyを使用)パラメーターをクリアします。

  2. [コンフィギュレーションパラメーター]ダイアログボックスで,[コード生成)[レポート]ペインに移動し,[コード生成レポートを作成)パラメーターと[レポートを自動的に開く]パラメーターを選択します。次に[コード生成)ペインに移動して[コード生成のみ]オプションを選択し,モデルのコードを生成します。コード生成が完了すると,HTMLコード生成レポートが表示されます。

  3. HTMLコード生成レポートで,vectorassign.cセクションをクリックし,モデルのステップ関数を検査します。ループを使用してベクトル割り当てが実装されていることに注意してください。

    /*模型step函数*/ void vectorassign_step(void) {int32_T;For (i = 0;我< 50;i++) {/* Outport: '/Out1'合并:* Inport: '/In1' */ vectorassign_Y。着干活[我]= vectorassign_U.In1[我];/* Outport: '/Out2'合并:* Inport: '/In2' */ vectorassign_Y。Out2[我]= vectorassign_U.In2[我];}}

最適化を使用したコードの生成

  1. [コンフィギュレーションパラメーター]ダイアログボックスの[最適化]ペインに移動し,[ベクトルの割り当てに対してmemcpyを使用)オプションをオンにします。[memcpyしきい値(バイト))オプションを既定の設定の64のままにします。変更を適用して,モデルのコードを再生成します。コード生成が完了すると,HTMLコード生成レポートが再表示されます。

  2. HTMLコード生成レポートで,vectorassign.cセクションをクリックし,モデル出力関数を検査します。今度は関数memcpyの呼び出しを使用してベクトル割り当てが実装されていることに注意してください。

    /*模型step函数*/ void vectorassign_step(void) {/* Outport: '/Out1'合并:* Inport: '/In1' */ memcpy(&vectorassign_Y. y .);着干活[0],&vectorassign_U。三机一体[0], 50U * sizeof(real_T)); /* Outport: '/Out2' incorporates: * Inport: '/In2' */ memcpy(&vectorassign_Y.Out2[0], &vectorassign_U.In2[0], 50U * sizeof(real_T)); }

参考

関連するトピック