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 (加算) | 入力信号のデータ型が single、int8、int16、int32、int64、uint8、uint16、uint32、または uint64 である。 |
| Sum (減算) | 入力信号のデータ型が single、int8、int16、int32、int64、uint8、uint16、uint32、または uint64 である。 |
| Sum (要素の和) |
|
| Product, Matrix Multiply (積) | 入力信号のデータ型が single、int8、int16、int32、、uint8、uint16、または uint32 である。 |
| Product, Matrix Multiply (要素の積) |
|
| Gain |
|
| Abs | 入力信号のデータ型が single である。 |
| MinMax | 入力信号のデータ型が single である。 |
| MinMax (要素の MinMax) |
|
| MATLAB Function | MATLAB コードがGenerate SIMD Code from MATLAB Functions for ARM Platformsに示されている条件を満たしている。 |
| For Each Subsystem |
|
| Bitwise Operator |
|
| Shift Arithmetic | 入力信号のデータ型が int8、int16、または int32 である。 |
| Relational Operator | 入力信号のデータ型が single、int32、または uint32 である。 |
| Data Type Conversion |
|
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 です。

このモデルに対して生成される標準の 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 コードを生成するには、次のようにします。
Embedded Coder® アプリを開きます。
[C コード] タブで、[設定] 、 [ハードウェア実行] をクリックします。
SIMD コード生成をサポートするハードウェア ターゲットを選択します。以下のパラメーターを設定します。
ハードウェア ボード —
Noneにするか、次のデバイス ベンダーとデバイス タイプの設定になるハードウェア ボードを選択します。デバイス ベンダー —
ARM Compatibleデバイス タイプ —
[ARM Cortex-A (32-bit)]または[ARM Cortex-A (64-bit)]
[最適化] ペインの [ターゲット ハードウェアの命令セット拡張を活用] リストから、
[Neon v7]を選択します。Neon v7命令セットでは、ARM v8 および ARM v9 などのターゲット ハードウェア ARM v7 以上がサポートされています。必要に応じて、[リダクションの最適化] パラメーターを選択してリダクション演算用の SIMD コードを生成するか、[FMA] パラメーターを選択して融合積和演算用の SIMD コードを生成します。
モデルからコードを生成します。
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 命令の存在により、コード実行時間を大幅に高速化できます。