Разверните параллель for- Цикл, который имеет небольшое количество итераций

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

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

Откройте модель rtwdemo_unroll_parfor в качестве примера. Модель сконфигурирована, чтобы сгенерировать многопоточный код путем выбора параметра циклов for параллели Generate.

model = 'rtwdemo_unroll_parfor';
open_system(model)

Блок MATLAB function содержит этот код:

type('myloop.m')
function y = myloop(u)
  y = ones(1,100);
  parfor (i = 1:5)
    y(i) = i+u;
  end
end

Код содержит parfor- цикл, который имеет пять итераций.

Сгенерируйте код при помощи порогового значения по умолчанию

1. Создайте временную папку для сборки и инспекционного процесса.

currentDir = pwd;
[~,cgDir] = rtwdemodir();

2. Создайте модель.

slbuild(model);
### Starting build procedure for: rtwdemo_unroll_parfor
### Successful completion of code generation for: rtwdemo_unroll_parfor

Build Summary

Top model targets built:

Model                  Action          Rebuild Reason                                    
=========================================================================================
rtwdemo_unroll_parfor  Code generated  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 8.818s

Смотрите сгенерированный rtwdemo_unroll_parfor_step ступенчатая функция в rtwdemo_unroll_parfor.c .

file = fullfile('rtwdemo_unroll_parfor_ert_rtw','rtwdemo_unroll_parfor.c');
rtwdemodbtype(file,'/* Model step function */','/* Model initialize function',1,1);
/* Model step function */
void rtwdemo_unroll_parfor_step(void)
{
  int32_T b_i;
  int32_T i_0;

  /* MATLAB Function: '<Root>/MATLAB Function' */
  for (i_0 = 0; i_0 < 100; i_0++) {
    rtwdemo_unroll_parfor_Y.Outport[i_0] = 1.0;
  }

#pragma omp parallel for num_threads(omp_get_max_threads())

  for (b_i = 0; b_i < 5; b_i++) {
    rtwdemo_unroll_parfor_Y.Outport[b_i] = ((real_T)b_i + 1.0) + 2.0;
  }

  /* End of MATLAB Function: '<Root>/MATLAB Function' */
}

Генератор кода генерирует параллельный for- цикл для блока MATLAB function, потому что это имеет 5 итераций, который равен пороговому значению по умолчанию.

Сгенерируйте код повышением порогового значения

1. Откройте диалоговое окно Configuration Parameters. На панели Оптимизации, установленной порог Развертывания цикла к 6 . В качестве альтернативы используйте API командной строки:

set_param(model, 'RollThreshold','6')

Создайте модель. Смотрите сгенерированный rtwdemo_unroll_parfor_step ступенчатая функция в rtwdemo_unroll_parfor.c.

slbuild(model);
file = fullfile('rtwdemo_unroll_parfor_ert_rtw','rtwdemo_unroll_parfor.c');
rtwdemodbtype(file,'/* Model step function */','/* Model initialize function',1,1);
### Starting build procedure for: rtwdemo_unroll_parfor
### Successful completion of code generation for: rtwdemo_unroll_parfor

Build Summary

Top model targets built:

Model                  Action          Rebuild Reason                   
========================================================================
rtwdemo_unroll_parfor  Code generated  Generated code was out of date.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 5.8367s

/* Model step function */
void rtwdemo_unroll_parfor_step(void)
{
  int32_T i;

  /* MATLAB Function: '<Root>/MATLAB Function' */
  for (i = 0; i < 100; i++) {
    rtwdemo_unroll_parfor_Y.Outport[i] = 1.0;
  }

  rtwdemo_unroll_parfor_Y.Outport[0] = 3.0;
  rtwdemo_unroll_parfor_Y.Outport[1] = 4.0;
  rtwdemo_unroll_parfor_Y.Outport[2] = 5.0;
  rtwdemo_unroll_parfor_Y.Outport[3] = 6.0;
  rtwdemo_unroll_parfor_Y.Outport[4] = 7.0;

  /* End of MATLAB Function: '<Root>/MATLAB Function' */
}

Генератор кода разворачивает параллельный for- цикл и производит копию тела цикла для каждой итерации, потому что это имеет меньше итераций по сравнению с пороговым значением.

Очистите папки в качестве примера и файлы

Закройте модель и удалите временные папки и файлы.

bdclose(model);
cd(currentDir);
rtwdemoclean;

Похожие темы

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