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;