Сгенерируйте код, содержащий одну инструкцию несколько данных для моделей Simulink

Чтобы улучшить скорость выполнения кода, используйте Одну инструкцию несколько данных (SIMD), которая позволяет процессорам выполнить одну инструкцию относительно нескольких точек данных. Этот параллельный расчет включен при помощи вычислительных инструкций и инструкций по управлению данными. Вычислительные инструкции включают операции, такие как арифметические операции на данных, которые хранятся в векторных регистрах. Инструкции по управлению данными включают перемещение и организацию данных из регистров.

SIMD доступен на системах команд, таких как Intel SSE, Intel AVX, и Inlined ARM NEON Intrinsics. Чтобы сгенерировать код, который содержит инструкции SIMD, выберите соответствующую заменяющую библиотеку кода. Поддерживаемыми типами данных является single'double'int32, и int64.

Доступность SIMD для блоков Simulink™ и заменяющая библиотека кода для целевого компьютера находятся как показано в таблице.

Арифметические операции Блоки SimulinkIntel SSEIntel AVX Intel AVX-512

Встроенный ARM внутренние параметры NEON

СложениеAddПоддержки single'double'int32, и int64Поддержки single'double'int32, и int64Поддержки single и doubleПоддержки single
ВычитаниеAddПоддержки single'double'int32, и int64Поддержки single'double'int32, и int64Поддержки single и doubleПоддержки single
УмножениеProduct, GainПоддержки single'double', и int32Поддержки single'double', и int32Поддержки single и doubleПоддержки single
ДелениеDivideПоддержки single и doubleПоддержки single и doubleПоддержки single и doubleНе поддерживаемый
Квадратный кореньSqrtПоддержки single и doubleПоддержки single и doubleПоддержки single и doubleНе поддерживаемый
ОкруглениеCeil и FloorПоддержки single и doubleПоддержки single и doubleНе поддерживаемыйНе поддерживаемый

Оптимизация SIMD доступна для блока For Each и блоков MATLAB Function, содержащих for-loops. Генерация кода SIMD также поддерживается для некоторых блоков DSP System Toolbox, таких как КИХ-Интерполяция (DSP System Toolbox), КИХ-Децимация (DSP System Toolbox), Фильтр LMS (DSP System Toolbox) и Дискретный КИХ-Фильтр. Чтобы идентифицировать другие блоки DSP System Toolbox, которые поддерживают генерацию кода SIMD, смотрите раздел Extended Capability каждого блока.

Включите SIMD в сгенерированном коде

В диалоговом окне Configuration Parameters выберите необходимый Device vendor и Device type. Чтобы включить SIMD, на панели Interface, выбирают параметр Code replacement library путем нажатия на Select и добавления необходимых заменяющих библиотек кода в панель списка Selected code replacement libraries - prioritized. Эта таблица показывает заменяющие библиотеки кода для поддерживаемого Device vendor и Device type.

Поставщик устройстваТип устройстваЗаменяющая библиотека кода
Intel или AMDx86-64(Windows 64)

Intel SSE (Windows)

Intel AVX (Windows)

Intel AVX-512 (Windows)

x86-64(Linux 64)

Intel SSE (Linux)

Intel AVX (Linux)

Intel AVX-512 (Linux)

ARM CompatibleARM Cortex-A

Встроенный ARM внутренние параметры NEON

В качестве альтернативы можно использовать командную строку, чтобы выбрать библиотеку. Установить заменяющую библиотеку кода для в настоящее время открытой модели myExampleModel, установите параметр на 'CodeReplacementLibrary' и выберите библиотеку, такую как 'Intel SSE (Windows)'.

set_param('myExampleModel','CodeReplacementLibrary','Intel SSE (Windows)')

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

Рассмотрите модель, которая имеет два блока Divide с одним блоком, имеющим тип входных данных single и другой блок, имеющий тип входных данных double.

Сгенерируйте код, не добавляя заменяющую библиотеку кода в панель Selected code replacement libraries - prioritized. Этот сгенерированный код выполняет цикл одна итерация за один раз.

void mDiv_step(void)
{
  int32_T i;
  for (i = 0; i < 140; i++) {
  mDiv_Y.Out2[i] = mDiv_U.In1[i] / mDiv_U.In2[i];
  mDiv_Y.Out3[i] = mDiv_U.In5[i] / mDiv_U.In6[i];
  }
}

Сгенерируйте код, содержащий инструкции SIMD путем добавления соответствующей заменяющей библиотеки кода в панель Selected code replacement libraries - prioritized. Этот сгенерированный код для Intel SSE(Windows) заменяющая библиотека кода.

void mDiv_step(void)
{
   int32_T idx;
   for (idx = 0; idx <= 136; idx += 4) {
    _mm_storeu_ps(&mDiv_Y.Out2[idx], 
    _mm_div_ps(_mm_loadu_ps(&mDiv_U.In1[idx]),
    _mm_loadu_ps(&mDiv_U.In2[idx])));
   }
      
   for (idx = 0; idx <= 138; idx += 2) {
    _mm_storeu_pd(&mDiv_Y.Out3[idx], 
    _mm_div_pd(_mm_loadu_pd(&mDiv_U.In5[idx]),
    _mm_loadu_pd(&mDiv_U.In6[idx])));
   }
}
 
Инструкции SIMD обрабатывают циклы с шагом четыре и два. Во время выполнения цикла переменные цикла обрабатываются параллельно через вычислительные функции инструкций _mm_div_ps и _mm_div_pd. Этот процесс улучшает скорость выполнения сгенерированного кода, когда развернуто на целевом компьютере. Инструкции по управлению данными _mm_storeu_ps и _mm_loadu_ps сохраните и загрузите данные из регистров SIMD. Для блока Divide, который имеет тип данных double, цикл выполняется с шагом два. Для блока Divide, который имеет тип данных single, цикл выполняется с шагом четыре.

Для списка Intel встроенные функции для поддерживаемых блоков Simulink см. https://software.intel.com/sites/landingpage/IntrinsicsGuide/. Для списка Inlined ARM NEON Intrinsics функции, см. https://developer.arm.com/architectures/instruction-sets/simd-isas/neon/intrinsics.

Ограничения

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

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

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

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

  • Код в блоке MATLAB Function содержит параллельные циклы for (parfor). parfor цикл не оптимизирован, но никакие циклы в теле parfor цикл может быть векторизован.

  • Параметр Partition Dimension Для Каждой подсистемы ниже параметра конфигурации Loop unrolling threshold.

Похожие темы