В этом примере показано, как сгенерировать оптимизированную одну инструкцию, несколько данных (SIMD), код, который выполняет сплавленный, умножается - добавляют операции. Сплавленный умножается - добавляют, что операция выполняется за один шаг с одним округлением вместо того, чтобы выполнить операцию умножения, сопровождаемую сложением с несколькими округлениями.
Для процессоров, которые поддерживают сплавленный, умножаются - добавляют инструкции (FMA), когда вы устанавливаете систему команд целевого компьютера Рычагов на FMA
, генератор кода генерирует код с внутренними параметрами FMA, чтобы выполнить сплавленный, умножаются - добавляют операции. Используя эту оптимизацию улучшает скорость выполнения сгенерированного кода SIMD. Из-за одного поведения округления сплавленных умножаются - добавляют операции, эта оптимизация может ввести несоответствие между результатами генерации кода и симуляцией.
Откройте модель rtwdemo_simd_with_fma
в качестве примера. Модель содержит операцию умножения, сопровождаемую сложением.
model = 'rtwdemo_simd_with_fma';
open_system(model)
1. Создайте временную папку для сборки и инспекционного процесса.
currentDir = pwd; [~,cgDir] = rtwdemodir();
2. На панели Оптимизации, набор расширения системы команд целевого компьютера Рычагов SSE2
. В качестве альтернативы можно использовать API командной строки:
set_param(model, 'InstructionSetExtensions', 'SSE2');
3. Создайте модель.
slbuild(model);
### Starting build procedure for: rtwdemo_simd_with_fma ### Successful completion of code generation for: rtwdemo_simd_with_fma Build Summary Top model targets built: Model Action Rebuild Reason ========================================================================================= rtwdemo_simd_with_fma Code generated Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 7.7318s
4. Смотрите сгенерированный rtwdemo_simd_with_fma_step
ступенчатая функция в rtwdemo_simd_with_fma.c
.
file = fullfile('rtwdemo_simd_with_fma_ert_rtw','rtwdemo_simd_with_fma.c'); rtwdemodbtype(file,'/* Model step function */','/* Model initialize function',1,1);
/* Model step function */ void rtwdemo_simd_with_fma_step(void) { int32_T i; for (i = 0; i <= 124; i += 4) { /* Outport: '<Root>/Out1' incorporates: * Inport: '<Root>/u' * Inport: '<Root>/v' * Inport: '<Root>/w' */ _mm_storeu_ps(&rtwdemo_simd_with_fma_Y.Out1[i], _mm_add_ps(_mm_mul_ps (_mm_loadu_ps(&rtwdemo_simd_with_fma_U.single1X128[i]), _mm_loadu_ps (&rtwdemo_simd_with_fma_U.single1X128_f[i])), _mm_loadu_ps (&rtwdemo_simd_with_fma_U.single1X128_k[i]))); } }
Сгенерированный код содержит векторизованный цикл, который выполняет умножение и операции сложения последовательно с двумя округлениями.
1. Чтобы включить оптимизацию FMA, на панели Оптимизации, устанавливают расширения системы команд целевого компьютера Рычагов FMA
В качестве альтернативы можно использовать API командной строки:
set_param(model, 'InstructionSetExtensions', 'FMA');
2. Создайте модель.
slbuild(model);
### Starting build procedure for: rtwdemo_simd_with_fma ### Successful completion of code generation for: rtwdemo_simd_with_fma Build Summary Top model targets built: Model Action Rebuild Reason ======================================================================== rtwdemo_simd_with_fma Code generated Generated code was out of date. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 5.9099s
3. Смотрите сгенерированный rtwdemo_simd_with_fma_step
ступенчатая функция в rtwdemo_simd_with_fma.c
.
file = fullfile('rtwdemo_simd_with_fma_ert_rtw','rtwdemo_simd_with_fma.c'); rtwdemodbtype(file,'/* Model step function */','/* Model initialize function',1,1);
/* Model step function */ void rtwdemo_simd_with_fma_step(void) { int32_T i; for (i = 0; i <= 120; i += 8) { /* Outport: '<Root>/Out1' incorporates: * Inport: '<Root>/u' * Inport: '<Root>/v' * Inport: '<Root>/w' */ _mm256_storeu_ps(&rtwdemo_simd_with_fma_Y.Out1[i], _mm256_fmadd_ps (_mm256_loadu_ps(&rtwdemo_simd_with_fma_U.single1X128[i]), _mm256_loadu_ps(&rtwdemo_simd_with_fma_U.single1X128_f[i]), _mm256_loadu_ps(&rtwdemo_simd_with_fma_U.single1X128_k[i]))); } }
Векторизованный цикл содержит встроенную функцию mm256_fmadd_ps
это выполняет сложение умножения за один шаг с одним округлением. Эта оптимизация улучшает скорость выполнения сгенерированного кода. Возможно, что выполнение сгенерированного кода не приводит к тому же результату как симуляция.
О присутствии оптимизации FMA сообщают в отчете генерации кода можно следующим образом.
Сообщается, что генератор кода использовал расширения системы команд FMA, и оптимизация FMA инициирована для rtwdemo_simd_with_fma
типовой кодекс. Если вы работаете с иерархией модели, и оптимизация FMA инициирована только для моделей, на которые ссылаются, генератор кода не сообщает о присутствии оптимизации FMA в отчете генерации кода, созданном для топ-модели.
Закройте модель и удалите временные папки и файлы.
bdclose(model); cd(currentDir); rtwdemoclean;
Усильте расширения системы команд целевого компьютера