Main Content

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

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

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

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

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

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

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

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

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

メモ

memcpy の最適化は特定の条件では発生しません。他の最適化のほうが memcpy の最適化よりも優先順位が高い場合や、生成コードが S-Function ブロックに関連付けられている TLC ファイルなどの Target Language Compiler (TLC) コードから生成されている場合などです。

メモ

Embedded Coder® ソフトウェアのライセンスがある場合、コード置換ライブラリ (CRL) を使用して、生成モデル コードで使用するために関数 memcpy の独自のカスタム実装を実現できます。詳細については、メモリ関数のコード置換 (Embedded Coder)を参照してください。

モデル例

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

  1. In ブロック、Out ブロックおよび Selector ブロックを使用して、次のモデルを作成します。

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

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

コードの生成

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

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

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

    /* Model step function */
    void vectorassign_step(void)
    {
      int32_T i;
      for (i = 0; i < 50; i++) {
        /* Outport: '<Root>/Out1' incorporates:
         *  Inport: '<Root>/In1'
         */
        vectorassign_Y.Out1[i] = vectorassign_U.In1[i];
    
        /* Outport: '<Root>/Out2' incorporates:
         *  Inport: '<Root>/In2'
         */
        vectorassign_Y.Out2[i] = vectorassign_U.In2[i];
      }
    }

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

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

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

    /* Model step function */
    void vectorassign_step(void)
    {
      /* Outport: '<Root>/Out1' incorporates:
       *  Inport: '<Root>/In1'
       */
      memcpy(&vectorassign_Y.Out1[0], &vectorassign_U.In1[0], 50U * sizeof(real_T));
    
      /* Outport: '<Root>/Out2' incorporates:
       *  Inport: '<Root>/In2'
       */
      memcpy(&vectorassign_Y.Out2[0], &vectorassign_U.In2[0], 50U * sizeof(real_T));
    }

参考

関連するトピック