Вы можете сгенерировать код SIMD (одна инструкция, несколько данных) из некоторых блоков Simulink с помощью технологий Intel AVX и Intel SSE. SIMD является вычислительной парадигмой, в которой одна команда обрабатывает несколько данных. Во многих современных процессорах есть SIMD-инструкции, которые, например, выполняют сразу несколько сложений или умножений. Для интенсивных в вычислительном отношении операций на поддерживаемых блоках SIMD-компоненты могут значительно улучшить эффективность сгенерированного кода на платформах Intel.
При выполнении определенных обстоятельств можно сгенерировать код SIMD с помощью технологии Intel SE или Intel AVX. Эта таблица списков блоки, которые поддержка генерацию кода SIMD. В таблице также указаны условия, при которых предоставляется поддержка.
| Блок | Условия |
|---|---|
| Add |
|
| Subtract |
|
| Product |
|
| Gain |
|
| Divide | Входной сигнал имеет тип данных single или double. |
| Sqrt | Входной сигнал имеет тип данных single или double. |
| Ceil |
|
| Floor |
|
| MinMax |
|
| MATLAB Function | Код MATLAB соответствует условиям, указанным в этой теме: Сгенерируйте код SIMD для функций MATLAB. |
| For Each Subsystem |
|
Если у вас есть DSP System Toolbox™, можно также сгенерировать код SIMD из определенных блоков DSP System Toolbox. Для получения дополнительной информации смотрите Блоки Simulink в DSP System Toolbox, которые поддерживают генерацию кода SIMD (DSP System Toolbox).
Простая модель 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 код
Откройте приложение Embedded Coder.
Щелкните Settings > Hardware Implementation.
Установите параметр Device vendor на Intel или AMD.
Установите значение параметра Device type на x86-64(Windows 64) или x86-64(Linux 64).
На панели 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 AVX | SSE, SSE2, SSE4.1, AVX, AVX2 |
| Функции Intel AVX-512 | SSE, SSE2, SSE4.1, AVX, AVX2, AVX-512 |
Сгенерируйте код из модели.
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.