Чтобы улучшить скорость выполнения кода, используйте Одну инструкцию несколько данных (SIMD), которая позволяет процессорам выполнить одну инструкцию относительно нескольких точек данных. Этот параллельный расчет включен при помощи вычислительных инструкций и инструкций по управлению данными. Вычислительные инструкции включают операции, такие как арифметические операции на данных, которые хранятся в векторных регистрах. Инструкции по управлению данными включают перемещение и организацию данных из регистров.
SIMD доступен на системах команд, таких как Intel SSE
, Intel AVX
, и Inlined ARM NEON Intrinsics
. Чтобы сгенерировать код, который содержит инструкции SIMD, выберите соответствующую заменяющую библиотеку кода. Поддерживаемыми типами данных является single
'double'
int8
int16
int32
, и int64
.
Доступность SIMD для функций MATLAB® и операций и заменяющей библиотеки кода для целевого компьютера находится как показано в таблице.
Математические функции | Функции MATLAB | Intel SSE | Intel AVX | Intel AVX-512 | Встроенный ARM внутренние параметры NEON |
---|---|---|---|---|---|
Сложение | + | Поддержки single 'double' int8 int16 int32 , и int64 | Поддержки single 'double' int8 int16 int32 , и int64 | Поддержки single и double | Поддержки single
|
Вычитание | -
| Поддержки single 'double' int8 int16 int32 , и int64 | Поддержки single 'double' int8 int16 int32 , и int64 | Поддержки single и double | Поддержки single
|
Умножение | .* | Supportssingle 'double' int16 , и int32 | Supportssingle 'double' int16 , и int32 | Supportssingle и double | Поддержки single
|
Деление | ./ | Поддержки single и double | Поддержки single и double | Поддержки single и double | Не поддерживаемый |
Квадратный корень | sqrt | Поддержки single и double | Поддержки single и double | Поддержки single и double | Не поддерживаемый |
Окружение | ceil | Поддержки single и double | Поддержки single и double | Не поддерживаемый | Не поддерживаемый |
Округление в меньшую сторону | floor | Поддержки single и double | Поддержки single и double | Не поддерживаемый | Не поддерживаемый |
Генерация кода SIMD также поддерживается для некоторых системных объектов в DSP System Toolbox, таких как dsp.FIRFilter
(DSP System Toolbox), dsp.FIRDecimator
(DSP System Toolbox), dsp.FIRInterpolator
(DSP System Toolbox) и dsp.LMSFilter
(DSP System Toolbox).
Чтобы включить замену SIMD, в приложении MATLAB Coder, после выбора необходимого Device vendor и Device type, на вкладке Custom Code, устанавливают параметр Code replacement library. Эта таблица показывает заменяющие библиотеки кода для поддерживаемого 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 |
В качестве альтернативы в coder.EmbeddedCodeConfig
объект настройки, установленный параметр CodeReplacementLibrary
параметр к библиотеке, такой как 'Intel AVX (Windows)'
.
cfg = coder.config('lib'); cfg.CodeReplacementLibrary = 'Intel AVX (Windows)';
Считайте функцию MATLAB dynamic
это имеет сумму выражения продуктов и переменных с типом данных single
. Связанный цикл не установлен во время компиляции. Таблица показывает сгенерированный код, когда никакая заменяющая библиотека кода не выбрана, и цикл выполняет одну итерацию за один раз. Когда вы выбираете Intel SSE(Windows)
как заменяющая библиотека кода, сгенерированный код содержит инструкции SIMD. Инструкции SIMD могут обработать цикл с шагом четыре через вычислительную функцию, таким как _mm_add_ps
и mm_mul_ps
Инструкции по управлению данными.The _mm_storeu_ps
и _mm_loadu_ps
сохраните и загрузите данные из регистров SIMD. Если типом данных является double
, цикл выполняется с шагом два. Переменные, которые не могут быть векторизованы, обрабатываются в цикле при помощи итератора scalarLB
.
КОД MATLAB | Сгенерированный код C без SIMD | Оптимизированный код SIMD |
---|---|---|
function C = dynamic(A, B) assert(all(size(A) <= [100 100])); assert(all(size(B) <= [100 100])); assert(isa(A, 'single')); assert(isa(B, 'single')); C = zeros(size(A), 'like', A); for i = 1:numel(A) C(i) = (A(i) .* B(i)) + (A(i) .* B(i)); end end |
loop_ub = A_size[0] * A_size[1]; for (i = 0; i < loop_ub; i++) { C_data_tmp = A_data[i] * B_data[i]; C_data[i] = C_data_tmp + C_data_tmp; } |
loop_ub = A_size[0] * A_size[1]; scalarLB = loop_ub & -4; vectorUB = scalarLB - 4; for (i = 0; i <= vectorUB; i += 4) { r = _mm_mul_ps(_mm_loadu_ps(&A_data[i]), _mm_loadu_ps(&B_data[i])); _mm_storeu_ps(&C_data[i], _mm_add_ps(r, r)); } for (i = scalarLB; i < loop_ub; i++) { C_data_tmp = A_data[i] * B_data[i]; C_data[i] = C_data_tmp + C_data_tmp; } |
Для списка Intel встроенные функции для поддерживаемых функций MATLAB см. https://software.intel.com/sites/landingpage/IntrinsicsGuide/. Для списка Inlined ARM NEON Intrinsic
функции, см. https://developer.arm.com/architectures/instruction-sets/simd-isas/neon/intrinsics.
Сгенерированный код не оптимизирован через SIMD, когда код MATLAB содержит:
Скалярные операции вне цикла. Например, если a,b
, и c
скаляры, сгенерированный код не оптимизирует операцию, такую как c=a+b
.
Косвенно индексные массивы или матрицы. Например, если A,B,C
, и D
векторы, сгенерированный код не векторизован для операции, такой как D(A)=C(A)+B(A)
.
Параллельные циклы for (parfor
). parfor
цикл не оптимизирован, но никакие циклы в теле parfor
цикл может быть векторизован.