Чтобы улучшить скорость выполнения кода, используйте Одну инструкцию несколько данных (SIMD), которая позволяет процессорам выполнить одну инструкцию относительно нескольких точек данных. Этот параллельный расчет включен при помощи вычислительных инструкций и инструкций по управлению данными. Вычислительные инструкции включают операции, такие как арифметические операции на данных, которые хранятся в векторных регистрах. Инструкции по управлению данными включают перемещение и организацию данных из регистров.
SIMD доступен на системах команд, таких как Intel SSE
, Intel AVX
, и Inlined ARM NEON Intrinsics
. Чтобы сгенерировать код, который содержит инструкции SIMD, выберите соответствующую заменяющую библиотеку кода. Поддерживаемыми типами данных является single
'double'
int32
, и int64
.
Доступность SIMD для блоков Simulink™ и заменяющая библиотека кода для целевого компьютера находятся как показано в таблице.
Арифметические операции | Блоки Simulink | Intel SSE | Intel 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 каждого блока.
В диалоговом окне Configuration Parameters выберите необходимый Device vendor и Device type. Чтобы включить SIMD, на панели Interface, выбирают параметр Code replacement library путем нажатия на Select и добавления необходимых заменяющих библиотек кода в панель списка Selected code replacement libraries - prioritized. Эта таблица показывает заменяющие библиотеки кода для поддерживаемого Device vendor и Device type.
Поставщик устройства | Тип устройства | Заменяющая библиотека кода |
---|---|---|
Intel или AMD | x86-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 Compatible | ARM Cortex-A | Встроенный ARM внутренние параметры NEON |
В качестве альтернативы можно использовать командную строку, чтобы выбрать библиотеку. Установить заменяющую библиотеку кода для в настоящее время открытой модели myExampleModel
, установите параметр на 'CodeReplacementLibrary'
и выберите библиотеку, такую как 'Intel SSE (Windows)'
.
set_param('myExampleModel','CodeReplacementLibrary','Intel SSE (Windows)')
Рассмотрите модель, которая имеет два блока 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]))); } }
_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.