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