Вы можете сгенерировать код 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.