Main Content

Simulink ブロックからの SIMD コードの生成

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

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

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

ブロック条件
Add
  • AVX、SSE、および FMA の場合、入力信号のデータ型が single または double である。

  • AVX2、SSE4.1、および SSE2 の場合、入力信号のデータ型が singledoubleint8int16int32、または int64 である。

  • AVX512F の場合、入力信号のデータ型が single または double である。

Subtract
  • AVX、SSE、および FMA の場合、入力信号のデータ型が single または double である。

  • AVX2、SSE4.1、および SSE2 の場合、入力信号のデータ型が singledoubleint8int16int32、または int64 である。

  • AVX512F の場合、入力信号のデータ型が single または double である。

Sum of Elements
  • AVX、SSE、および FMA の場合、入力信号のデータ型が single または double である。

  • AVX2、SSE4.1、および SSE2 の場合、入力信号のデータ型が singledoubleint8int16int32、または int64 である。

  • AVX512F の場合、入力信号のデータ型が single または double である。

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

Product
  • AVX、SSE、および FMA の場合、入力信号のデータ型が single または double である。

  • AVX2、SSE4.1、および SSE2 の場合、入力信号のデータ型が singledoubleint16、または int32 である。

  • AVX512F の場合、入力信号のデータ型が single または double である。

  • [乗算] パラメーターを [要素単位(.*)] に設定する

Product of Elements
  • AVX、SSE、および FMA の場合、入力信号のデータ型が single または double である。

  • AVX2、SSE4.1、および SSE2 の場合、入力信号のデータ型が singledoubleint16、または int32 である。

  • AVX512F の場合、入力信号のデータ型が single または double である。

  • [乗算] パラメーターを [要素単位(.*)] に設定する

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

Gain
  • AVX および SSE の場合、入力信号のデータ型が single または double である。

  • AVX2、SSE4.1、および SSE2 の場合、入力信号のデータ型が singledoubleint16、または int32 である。

  • Intel AVX512F の場合、入力信号のデータ型が single または double である。

  • [乗算] パラメーターを [要素単位(.*)] に設定する

Divide入力信号のデータ型が single または double である。
Sqrt入力信号のデータ型が single または double である。
Ceil
  • AVX2、AVX、SSE4.1、SSE2、および SSE の場合、入力信号のデータ型が single または double である。

  • AVX512F はサポートされない。

Floor
  • AVX2、AVX、SSE4.1、SSE2、および SSE の場合、入力信号のデータ型が single または double である。

  • AVX512F はサポートされない。

MinMax
  • 入力信号のデータ型が single または double である。

  • [サポート: 非有限数] コンフィギュレーション パラメーターの値が off に設定されている。

MinMax of Elements
  • 入力信号のデータ型が single または double である。

  • [サポート: 非有限数] コンフィギュレーション パラメーターの値が off に設定されている。

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

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

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

Bitwise Operator
  • [演算子] ブロック パラメーターの値は ANDOR、または XOR でなければならない。

  • SSE2 の場合、入力信号のデータ型が int8int16int32、または int64 である。

  • AVX2 および AVX512F の場合、入力信号のデータ型が int8int16int32、または int64 である。

Shift Arithmetic
  • 入力信号のデータ型が int32 である。

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

Embedded Coder Support Package for ARM® Cortex®-A Processors がある場合は、Code replacement librariesパラメーターを [GCC ARM Cortex-A] に設定することで、ARM Cortex A プロセッサ向けに最適化された SIMD コードを生成できます。さらに、[デバイス ベンダー] パラメーターを [ARM Compatible][デバイス タイプ] パラメーターを [ARM Cortex-A] に設定する必要があります。

SIMD コードの生成と標準の C コードとの比較

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

Simulink model containing subtract block and divide 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];
  }

  for (i = 0; i < 140; i++) {
    simdDemo_Y.Out2[i] = simdDemo_U.In3[i] / simdDemo_U.In4[i];
  }
}
標準 (非 SIMD) の C コードでは、各ループ反復で 1 つの結果が生成されます。

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

  1. Simulink Coder™ アプリまたは Embedded Coder アプリを開きます。

  2. [設定][ハードウェア実行] をクリックします。

  3. [デバイス ベンダー] パラメーターを [Intel] または [AMD] に設定します。

  4. [デバイス タイプ] パラメーターを [x86-64(Windows 64)] または [x86-64(Linux 64)] に設定します。

  5. [最適化] ペインの [ターゲット ハードウェアの命令セット拡張を活用] パラメーターで、プロセッサでサポートされる命令セット拡張を選択します。たとえば SSE2 を選択します。Embedded Coder を使用している場合は、SSESSE4.1AVXAVX2FMAAVX512F の命令セットも選択できます。詳細については、https://www.intel.com/content/www/us/en/support/articles/000005779/processors.htmlを参照してください。

  6. 必要に応じて、[リダクションの最適化] パラメーターを選択してリダクション演算の SIMD コードを生成します。

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

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 コード生成を無効にするには、[ターゲット ハードウェアの命令セット拡張を活用] パラメーターを [なし] に設定します。

  • 非有限数のサポートが有効になっている場合の浮動小数点値に対するリダクション演算。浮動小数点値に対するリダクション演算の SIMD コードを生成するには、コンフィギュレーション パラメーター [サポート: 非有限数]Off に設定します。

関連するトピック