В этом примере показано, как ускорить выполнение модели на нескольких ядрах с помощью подсистемы For Each в режиме симуляции Rapid Accelerator.
В этой модели подсистема For Each принимает числовой вход массива. Каждый элемент массива служит верхней границей в каждой итерации и подает в вычислительно-интенсивный алгоритм, представленный блоком MATLAB Function внутри подсистемы. Алгоритм, реализованный в блоке MATLAB Function, вычисляет самое большое простое число в заданной области значений с помощью метода грубой силы, который предназначен только для иллюстративных целей.
modelName = 'slexForEachMultithreaded';
open_system(modelName);
По умолчанию включена поддержка многопоточной симуляции для подсистемы For Each. Чтобы отказаться от многопоточной симуляции, выдайте set_param
команда в Командном Окне MATLAB ®. В однопоточном симуляции расчетов в различных итерациях подсистемы For Each выполняются последовательно в течение каждого временного шага.
set_param(modelName, 'MultithreadedSim', 'off');
Поскольку выполнение в режиме Rapid Accelerator создает файлы, сначала создайте временную директорию и перейдите в него.
originalDir = pwd; tempDir = tempname; mkdir(tempDir); cd(tempDir);
Создайте цель Rapid Accelerator для модели. Прогресс генерации кода и процесса сборки отображается в Командном окне MATLAB. Чтобы подавить отображение, перетащите команду внутрь evalc
.
evalc('Simulink.BlockDiagram.buildRapidAcceleratorTarget(modelName)');
Этот шаг сборки является необязательным, потому что Simulink ® автоматически генерирует цель симуляции Rapid Accelerator при первой симуляции модели. В примере этот шаг служит, чтобы отделить накладные расходы при генерации цели Rapid Accelerator от фактического времени выполнения модели.
Когда цель Rapid Accelerator сгенерирована, симулируйте модель и измерьте время симуляции с помощью tic
и toc
.
tic
evalc('sim(modelName)');
toc
Elapsed time is 62.866800 seconds.
Чтобы явным образом выбрать поддержку многопоточности, выдайте set_param
команда в Командном Окне MATLAB. В многопоточном симуляции расчетов в различных итерациях подсистемы For Each назначаются нескольким ядрам и выполняются параллельно для ускорения.
set_param(modelName, 'MultithreadedSim', 'auto');
Снова создайте цель Rapid Accelerator, поскольку модель была перенастроена.
evalc('Simulink.BlockDiagram.buildRapidAcceleratorTarget(modelName)');
Симулируйте модель еще раз и измерьте время многопоточной симуляции. Заметьте, что симуляция модели выполняется в два раза быстрее, чем симуляция с одной резьбой на машине с четырьмя или более ядрами. Помните, что переключение контекста операционной системы в многопоточных симуляциях всегда приводит к дополнительным издержкам.
tic
evalc('sim(modelName)');
toc
Elapsed time is 21.424681 seconds.
Закройте модель и удалите сгенерированные файлы.
bdclose(modelName); cd(originalDir); rmdir(tempDir, 's'); clear originalDir tempDir;