Оптимизируйте код SIMD путем выполнения сплавленный, умножаются, добавляют операции

В этом примере показано, как сгенерировать оптимизированную одну инструкцию, несколько данных (SIMD), код, который выполняет сплавленный, умножается - добавляют операции. Сплавленный умножается - добавляют, что операция выполняется за один шаг с одним округлением вместо того, чтобы выполнить операцию умножения, сопровождаемую сложением с несколькими округлениями.

Для процессоров, которые поддерживают сплавленный, умножаются - добавляют инструкции (FMA), когда вы устанавливаете систему команд целевого компьютера Рычагов на FMA, генератор кода генерирует код с внутренними параметрами FMA, чтобы выполнить сплавленный, умножаются - добавляют операции. Используя эту оптимизацию улучшает скорость выполнения сгенерированного кода SIMD. Из-за одного поведения округления сплавленных умножаются - добавляют операции, эта оптимизация может ввести несоответствие между результатами генерации кода и симуляцией.

Модель в качестве примера

Откройте модель rtwdemo_simd_with_fma в качестве примера. Модель содержит операцию умножения, сопровождаемую сложением.

model = 'rtwdemo_simd_with_fma';
open_system(model)

Сгенерируйте код SIMD без оптимизации FMA

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])));
  }
}

Сгенерированный код содержит векторизованный цикл, который выполняет умножение и операции сложения последовательно с двумя округлениями.

Сгенерируйте код SIMD с оптимизацией FMA

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;

Смотрите также

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте