Intel プラットフォームの Simulink ブロックからの SIMD コードの生成
Intel® SSE や Embedded Coder® がある場合は Intel AVX テクノロジーを使用して、特定の Simulink® ブロックから単一命令複数データ (SIMD) コードを生成できます。SIMD は、単一の命令で複数のデータを処理するコンピューティング パラダイムです。多くの最新プロセッサには、たとえば複数の加算や乗算を一度に実行する SIMD 命令があります。サポートされているブロックでの計算量の多い演算について、SIMD 内部パラメーターにより、Intel プラットフォームでの生成コードのパフォーマンスを大幅に改善できます。
Embedded Coder Support Package for ARM® Cortex®-A Processors を使用して SIMD コードを生成するには、Generate SIMD Code from Simulink Blocks for ARM Platformsを参照してください。
Intel 用の SIMD コード生成をサポートするブロック
特定の条件を満たす場合、Intel SSE または Intel AVX テクノロジーを使用して SIMD コードを生成できます。次の表に、SIMD コード生成をサポートするブロックを示します。この表には、サポートを利用できる条件の詳細も示してあります。その他の一部のブロックは、コード ジェネレーターがベクトル化されたコードに変換できる制御フロー コードを生成する際に、SIMD コード生成をサポートします。たとえば、コード ジェネレーターは、SIMD 命令をもつ条件式を含む一部の for ループを置換できます。
| ブロック | 条件 |
|---|---|
| Add |
|
| Subtract |
|
| Sum of Elements |
|
| Product |
|
| Product of Elements |
|
| Gain |
|
| Divide | 入力信号のデータ型が single または double である。 |
| Sqrt | 入力信号のデータ型が single または double である。 |
| Ceil |
|
| Floor |
|
| MinMax | 入力信号のデータ型が single または double である。 |
| MinMax of Elements |
|
| MATLAB Function | MATLAB コードがGenerate SIMD Code from MATLAB Functions for Intel Platformsのトピックで示す条件を満たしている。 |
| For Each Subsystem |
|
| Bitwise Operator |
|
| Shift Arithmetic |
|
| Relational Operator (未満) |
|
| Relational Operator (以下) |
|
| Relational Operator (より大きい) |
|
| Relational Operator (以上) |
|
| Relational Operator (等しい) |
|
| Logical Operator |
|
| Data Type Conversion |
|
DSP System Toolbox™ がある場合は、特定の DSP System Toolbox ブロックからも SIMD コードを生成できます。詳細については、Simulink Blocks in DSP System Toolbox that Support SIMD Code Generation (DSP System Toolbox)を参照してください。
SIMD コードの生成と標準の C コードとの比較
この例では、Subtract ブロックと Divide ブロックをもつ単純なモデル simdDemo を作成します。Subtract ブロックの入力信号の次元は 240 で、入力データ型は single です。Divide ブロックの入力信号の次元は 140 で、入力データ型は double です。

このモデルに対して生成される標準の 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];
}
for (i = 0; i < 140; i++) {
simdDemo_Y.Out2[i] = simdDemo_U.In3[i] / simdDemo_U.In4[i];
}
}SIMD コードを生成するには、次のようにします。
Simulink Coder™ アプリまたは Embedded Coder アプリを開きます。
[設定] 、 [ハードウェア実行] をクリックします。
[デバイス ベンダー] パラメーターを
[Intel]または[AMD]に設定します。[デバイス タイプ] パラメーターを
[x86-64(Windows 64)]または[x86-64(Linux 64)]に設定します。[最適化] ペインの [ターゲット ハードウェアの命令セット拡張を活用] パラメーターで、プロセッサでサポートされる命令セット拡張を選択します。たとえば
SSE2を選択します。Embedded Coder を使用している場合は、SSE、SSE4.1、AVX、AVX2、FMA、AVX512Fの命令セットも選択できます。詳細については、https://www.intel.com/content/www/us/en/support/articles/000005779/processors.htmlを参照してください。必要に応じて、[リダクションの最適化] パラメーターを選択してリダクション演算の SIMD コードを生成します。
モデルからコードを生成します。
void simdDemo_step(void)
{
int32_T i;
for (i = 0; i <= 236; i += 4) {
_mm_storeu_ps(&simdDemo_Y.Out1[i], _mm_sub_ps(_mm_loadu_ps(&simdDemo_U.In1[i]),
_mm_loadu_ps(&simdDemo_U.In2[i])));
}
for (i = 0; i <= 138; i += 2) {
_mm_storeu_pd(&simdDemo_Y.Out2[i], _mm_div_pd(_mm_loadu_pd(&simdDemo_U.In3[i]),
_mm_loadu_pd(&simdDemo_U.In4[i])));
}
}
このコードは SSE2 命令セット拡張のものです。SIMD 命令は、識別子 _mm で始まる組み込み関数です。これらの関数では、ループが single データ型では 4 ずつ、double データ型では 2 ずつインクリメントするため、ループの 1 回の反復で複数のデータが処理されます。これよりも多くのデータを処理する計算量の多いモデルでは、SIMD 命令の存在により、コード実行時間を大幅に高速化できます。
サポートされている Simulink ブロックに対応する Intel の組み込み関数のリストについては、https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.htmlを参照してください。
制限
以下の場合、生成コードは SIMD で最適化されません。
ブロックの入力信号に複素数データ型が含まれ、基本データ型は
singleでもdoubleでもない。MATLAB Function ブロックのコードで、ループの本体の外にスカラー データ型がある。たとえば、
a,b,cがスカラーの場合、生成コードでc=a+bなどの演算は最適化されません。MATLAB Function ブロックのコードに、間接的なインデックスをもつ配列または行列がある。たとえば、
A,B,C,Dがベクトルの場合、生成コードはD(A)=C(A)+B(A)などの演算についてベクトル化されません。再利用可能なサブシステム内のブロックは最適化されないことがある。
MATLAB Function ブロックに並列 for ループ (
parfor) がある場合、parforループ本体の内部のループは SIMD コードで最適化できるが、parforループは SIMD コードで最適化されない。Polyspace® では SIMD 命令を含む生成コードの解析はサポートされない。SIMD コード生成を無効にするには、[ターゲット ハードウェアの命令セット拡張を活用] パラメーターを
[なし]に設定します。
参考
トピック
- Generate SIMD Code from MATLAB Functions for Intel Platforms
- Generate SIMD Code from Simulink Blocks for ARM Platforms
- Use Intel AVX2 Code Replacement Library to Generate SIMD Code from Simulink Blocks (DSP System Toolbox)
- Use Intel AVX2 Code Replacement Library to Generate SIMD Code from MATLAB Algorithms (DSP System Toolbox)