В этом примере показано, как ускорить выполнение модели на нескольких ядрах с помощью подсистемы «Для каждого» в режиме моделирования Rapid Accelerator.
В этой модели подсистема For Each принимает ввод числового массива. Каждый элемент массива служит верхней границей в каждой итерации и подается в ресурсоемкий алгоритм, представленный блоком MATLAB Function внутри подсистемы. Алгоритм, реализованный в блоке MATLAB Function, вычисляет наибольшее простое число в заданном диапазоне с использованием метода грубой силы, который используется только в иллюстративных целях.
modelName = 'slexForEachMultithreaded';
open_system(modelName);

По умолчанию поддержка многопоточного моделирования для подсистемы «Для каждого» включена. Чтобы отказаться от многопоточного моделирования, введите set_param в окне команд MATLAB ®. В однопоточном моделировании вычисления в различных итерациях подсистемы «Для каждой» выполняются последовательно в течение каждого временного шага.
set_param(modelName, 'MultithreadedSim', 'off');
Поскольку запуск в режиме ускорителя Rapid создает файлы, сначала создайте временный каталог и переместитесь в него.
originalDir = pwd; tempDir = tempname; mkdir(tempDir); cd(tempDir);
Создайте цель быстрого ускорителя для модели. Ход процесса создания и сборки кода отображается в окне команд MATLAB. Для подавления этого отображения оберните команду внутрь evalc.
evalc('Simulink.BlockDiagram.buildRapidAcceleratorTarget(modelName)');
Этот шаг сборки является необязательным, поскольку Simulink ® автоматически генерирует цель моделирования Rapid Accelerator при первом моделировании модели. В этом примере этот шаг служит для отделения накладных расходов при генерации цели ускорителя быстрого вызова от фактического времени выполнения модели.
После создания цели быстрого ускорителя смоделируйте модель и измерьте время моделирования с помощью tic и toc.
tic
evalc('sim(modelName)');
toc
Elapsed time is 62.866800 seconds.
Чтобы явно зарегистрироваться для поддержки многопоточности, введите set_param в окне команд MATLAB. При многопоточном моделировании вычисления в различных итерациях подсистемы «Для каждого» назначаются нескольким ядрам и выполняются параллельно для ускорения.
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;