Чтобы улучшить скорость выполнения кода, используйте Одну инструкцию несколько данных (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.