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

В этом примере показано, как ускорить выполнение модели на нескольких ядрах с помощью подсистемы 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;

См. также

|