メインコンテンツ

ARM プラットフォーム用の Simulink ブロックからの SIMD コードの生成

ARM® Neon テクノロジーを使用して、特定の Simulink® ブロックから単一命令複数データ (SIMD) コードを生成できます。SIMD は、単一の命令で複数のデータを処理するコンピューティング パラダイムです。多くの最新プロセッサには、たとえば複数の加算や乗算を一度に実行する SIMD 命令があります。サポートされているブロックでの計算量の多い演算について、SIMD 内部パラメーターにより、ARM Cortex®-A プラットフォームでの生成コードのパフォーマンスを大幅に改善できます。

Intel® プラットフォーム用の SIMD コードを生成する場合は、Intel プラットフォームの Simulink ブロックからの SIMD コードの生成を参照してください。

ARM 用の SIMD コード生成をサポートするブロック

特定の条件を満たす場合、ARM Neon テクノロジーを使用して SIMD コードを生成できます。次の表に、SIMD コード生成をサポートするブロックを示します。この表には、サポートを利用できる条件の詳細も示してあります。その他の一部のブロックは、コード ジェネレーターがベクトル化されたコードに変換できる制御フロー コードを生成する際に、SIMD コード生成をサポートします。たとえば、コード ジェネレーターは、SIMD 命令をもつ条件式を含む一部の for ループを置換できます。

ブロック条件
Sum (加算)入力信号のデータ型が singleint8int16int32int64uint8uint16uint32、または uint64 である。
Sum (減算)入力信号のデータ型が singleint8int16int32int64uint8uint16uint32、または uint64 である。
Sum (要素の和)
  • 入力信号のデータ型が singleint8int16int32int64uint8uint16uint32、または uint64 である。

  • [リダクションの最適化] コンフィギュレーション パラメーターが on に設定されている。

Product, Matrix Multiply (積)入力信号のデータ型が singleint8int16int32、uint8uint16、または uint32 である。
Product, Matrix Multiply (要素の積)
  • 入力信号のデータ型が singleint8int16int32、uint8uint16、または uint32 である。

  • [リダクションの最適化] コンフィギュレーション パラメーターが on に設定されている。

Gain
  • 入力信号のデータ型が singleint8int16int32、uint8uint16、または uint32 である。

  • [乗算] パラメーターが [要素単位(.*)] に設定されている。

Abs入力信号のデータ型が single である。
MinMax入力信号のデータ型が single である。
MinMax (要素の MinMax)
  • 入力信号のデータ型が single である。

  • [リダクションの最適化] コンフィギュレーション パラメーターが on に設定されている。

MATLAB FunctionMATLAB コードがGenerate SIMD Code from MATLAB Functions for ARM Platformsに示されている条件を満たしている。
For Each Subsystem
  • この表の条件を満たすリストされたブロックが For Each Subsystem ブロックに含まれている。

  • [分割次元] ブロック パラメーターの値が [ループ展開のしきい値] コンフィギュレーション パラメーターの値よりも大きい。

Bitwise Operator
  • [演算子] ブロック パラメーターが ANDOR、または XOR に設定されている。

  • 入力信号のデータ型が int8int16int32int64uint8uint16uint32、または uint64 である。

Shift Arithmetic入力信号のデータ型が int8int16、または int32 である。
Relational Operator入力信号のデータ型が singleint32、または uint32 である。
Data Type Conversion
  • [整数丸めモード] ブロック パラメーターの値が [ゼロ方向] または [最も簡潔] である。

  • ブロックが入力信号から出力信号への次のいずれかのデータ型変換を実行する。

    • single から int32

    • int32 から single

    • uint32 から single

DSP System Toolbox™ がある場合は、特定の DSP System Toolbox ブロックからも SIMD コードを生成できます。詳細については、Simulink Blocks in DSP System Toolbox that Support SIMD Code Generation (DSP System Toolbox)を参照してください。

ARM 用の標準の C コードと SIMD コードの生成

この例では、Subtract ブロックをもつ単純なモデル simdDemo を作成します。Subtract ブロックの入力信号の次元は 240 で、入力データ型は single です。

Simulink model containing subtract block.

このモデルに対して生成される標準の C コードは次のとおりです。

void simdDemo_step(void)
{
  int32_T i;
  for (i = 0; i < 240; i++) {
    simdDemo_Y.Out1[i] = simdDemo_U.In1[i] - simdDemo_U.In2[i];
  }
}
標準 (非 SIMD) の C コードでは、各ループ反復で 1 つの結果が生成されます。

SIMD コードを生成するには、次のようにします。

  1. Embedded Coder® アプリを開きます。

  2. [C コード] タブで、[設定][ハードウェア実行] をクリックします。

  3. SIMD コード生成をサポートするハードウェア ターゲットを選択します。以下のパラメーターを設定します。

  4. [最適化] ペインの [ターゲット ハードウェアの命令セット拡張を活用] リストから、[Neon v7] を選択します。Neon v7 命令セットでは、ARM v8 および ARM v9 などのターゲット ハードウェア ARM v7 以上がサポートされています。

  5. 必要に応じて、[リダクションの最適化] パラメーターを選択してリダクション演算用の SIMD コードを生成するか、[FMA] パラメーターを選択して融合積和演算用の SIMD コードを生成します。

  6. モデルからコードを生成します。

for (i = 0; i <= 236; i += 4) {
    vst1q_f32(&simdDemo_Y.Out1[i], vsubq_f32(vld1q_f32(&simdDemo_U.In1[i]),
               vld1q_f32(&simdDemo_U.In2[i])));
  }

SIMD 命令は、識別子 v で始まる組み込み関数です。これらの関数では、ループが single データ型では 4 ずつインクリメントするため、ループの 1 回の反復で複数のデータが処理されます。これよりも多くのデータを処理する計算量の多いモデルでは、SIMD 命令の存在により、コード実行時間を大幅に高速化できます。

参考