Сгенерируйте код SIMD из блоков Simulink

Вы можете сгенерировать код SIMD (одна инструкция, несколько данных) из некоторых блоков Simulink с помощью технологий Intel AVX и Intel SSE. SIMD является вычислительной парадигмой, в которой одна команда обрабатывает несколько данных. Во многих современных процессорах есть SIMD-инструкции, которые, например, выполняют сразу несколько сложений или умножений. Для интенсивных в вычислительном отношении операций на поддерживаемых блоках SIMD-компоненты могут значительно улучшить эффективность сгенерированного кода на платформах Intel.

Блоки, поддерживающие генерацию кода SIMD

При выполнении определенных обстоятельств можно сгенерировать код SIMD с помощью технологии Intel SE или Intel AVX. Эта таблица списков блоки, которые поддержка генерацию кода SIMD. В таблице также указаны условия, при которых предоставляется поддержка.

БлокУсловия
Add
  • Для Intel AVX и Intel SSE входной сигнал имеет тип данных single, double, int32, или int64.

  • Для Intel AVX-512 входной сигнал имеет тип данных single или double.

Subtract
  • Для Intel AVX и Intel SSE входной сигнал имеет тип данных single, double, int32, или int64.

  • Для Intel AVX-512 входной сигнал имеет тип данных single или double.

Product
  • Для Intel AVX и Intel SSE входной сигнал имеет тип данных single, double, или int32.

  • Для Intel AVX-512 входной сигнал имеет тип данных single или double.

  • Установите Multiplication параметр равным Element-wise(.*)

Gain
  • Для Intel AVX или Intel SSE входной сигнал имеет тип данных single, double, или int32.

  • Для Intel AVX-512 входной сигнал имеет тип данных single или double.

  • Установите Multiplication параметр равным Element-wise(.*)

DivideВходной сигнал имеет тип данных single или double.
SqrtВходной сигнал имеет тип данных single или double.
Ceil
  • Для Intel SSE и Intel AVX входной сигнал имеет тип данных single или double.

  • AVX-512 Intel не поддерживается.

Floor
  • Для Intel SSE и Intel AVX входной сигнал имеет тип данных single или double.

  • AVX-512 Intel не поддерживается.

MinMax
  • Входной сигнал имеет тип данных single или double.

  • Значение параметра конфигурации Support: non-finite numbers установлено в off.

MATLAB FunctionКод MATLAB соответствует условиям, указанным в этой теме: Сгенерируйте код SIMD для функций MATLAB.
For Each Subsystem
  • Блок For Each Subsystem содержит блок, перечисленный в этой таблице, который удовлетворяет заданным условиям.

  • Значение Partition Dimension параметров блоков должно быть выше значения параметра конфигурации Loop unrolling threshold.

Если у вас есть DSP System Toolbox™, можно также сгенерировать код SIMD из определенных блоков DSP System Toolbox. Для получения дополнительной информации смотрите Блоки Simulink в DSP System Toolbox, которые поддерживают генерацию кода SIMD (DSP System Toolbox).

Сгенерируйте код SIMD по сравнению с простым кодом С

Простая модель simdDemo имеет блок Subtract и блок Divide. Блок 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) коде С каждая итерация цикла выдает один результат.

Чтобы сгенерировать SIMD код

  1. Откройте приложение Embedded Coder.

  2. Щелкните Settings > Hardware Implementation.

  3. Установите параметр Device vendor на Intel или AMD.

  4. Установите значение параметра Device type на x86-64(Windows 64) или x86-64(Linux 64).

  5. На панели Interface для параметра Библиотеки замещения кода нажмите Select. В открывшемся диалоговом окне выберите библиотеку Intel AVX или Intel SSE. Библиотека, которую вы выбираете, зависит от того, какое расширение набора команд поддерживает ваш процессор. Для получения дополнительной информации см. https://www.intel.com/content/www/us/en/support/articles/000005779/processors.html. В этой таблице перечислены основные инструкции Intel, устанавливающие каждую библиотеку для замены кода:

    Библиотека замещения кодаНабор внутренних инструкций Intel
    Intel SSEМРЗ, SSE2, SSE4.1
    Intel AVXSSE, SSE2, SSE4.1, AVX, AVX2
    Функции Intel AVX-512SSE, SSE2, SSE4.1, AVX, AVX2, AVX-512

  6. Сгенерируйте код из модели.

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])));
  }
}
   
 

Этот код предназначен для Intel SSE библиотека замещения кода. Инструкции SIMD являются внутренними функциями, которые начинаются с идентификатора _mm. Эти функции обрабатывают несколько данных в одной итерации цикла, потому что цикл увеличивается на четыре для одиночных типов данных и на два для двойных типов данных. Для моделей, которые обрабатывают больше данных и являются в вычислительном отношении более интенсивными, чем эта, наличие SIMD-команд может значительно ускорить время выполнения кода.

Список внутренних функций Intel для поддерживаемых блоков Simulink см. в разделе https://software.intel.com/sites/landingpage/IntrinsicsGuide/.

Ограничения

Сгенерированный код не оптимизируется через SIMD, если:

  • Код в блоке MATLAB Function содержит скалярные типы данных вне тела циклов. Для образца, если a,b, и c являются скалярами, сгенерированный код не оптимизирует операцию, такую как c=a+b.

  • Код в блоке MATLAB Function содержит косвенно индексированные массивы или матрицы. Для образца, если A,B,C, и D являются векторами, сгенерированный код не векторизован для такой операции, как D(A)=C(A)+B(A).

  • Блоки в переиспользуемой подсистеме могут быть не оптимизированы.

  • Если код в блоке MATLAB Function содержит параллельные for-Loops (parfor), а parfor цикл не оптимизирован с помощью кода SIMD, но циклы внутри тела parfor цикл может быть оптимизирован с помощью кода SIMD.

Похожие темы