Многопоточное использование Симуляции Для Каждой Подсистемы

В этом примере показано, как ускорить выполнение модели на нескольких ядрах с помощью Для Каждой подсистемы в Быстром режиме симуляции Акселератора.

Измерьте однопоточное время симуляции

В этой модели, Для Каждой подсистемы принимает вход числового массива. Каждый элемент массива служит верхней границей в каждой итерации и питается в в вычислительном отношении интенсивный алгоритм представленный блоком 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
Elapsed time is 62.866800 seconds.

Используйте многопоточную симуляцию для ускорения на нескольких ядрах

Чтобы явным образом подписаться к поддержке многопоточности, выпустите set_param команда в командном окне MATLAB. В многопоточной симуляции расчеты в различных итерациях Для Каждой подсистемы присвоены нескольким ядрам и выполнены параллельно для ускорения.

set_param(modelName, 'MultithreadedSim', 'auto');

Создайте Быструю цель Акселератора снова, поскольку модель была реконфигурирована.

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;

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

|