Очистка рабочих репозиториев
Simulink.sdi.cleanupWorkerResources
удаляет избыточные данные из каждого файла параллельного рабочего репозитория, используемого Данные Моделирования Inspector. Вызовите эту функцию во время работы рабочих пулов. Инспектор Данных моделирования автоматически очищает файлы репозитория, когда вы закрываете пул рабочих.
Этот пример выполняет параллельные симуляции модели slexAircraftExample
с различными временными константами входного фильтра и показывает несколько способов доступа к данным с помощью программного интерфейса Данные Моделирования Inspector.
Setup
Начните, убедившись, что Данные Моделирования Inspector пусты, а поддержка Parallel Computing Toolbox сконфигурирована для автоматического импорта запусков, созданных локальными работниками. Затем создайте вектор значений параметров фильтра для использования в каждой симуляции.
% Make sure the Simulation Data Inspector is empty, and PCT support is % enabled. Simulink.sdi.clear Simulink.sdi.enablePCTSupport('local') % Define Ts values Ts_vals = [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1];
Инициализация параллельных рабочих процессов
Используйте gcp, чтобы создать пул локальных рабочих для выполнения параллельных симуляций, если их еще нет. В spmd
кодовый блок, загрузка slexAircraftExample
моделируйте и выбирайте сигналы для регистрации. Чтобы избежать проблем параллелизма данных, используйте sim
в parfor
, создайте временную директорию для каждого работника, который будет использоваться во время симуляций.
p = gcp;
Starting parallel pool (parpool) using the 'local' profile ... connected to 4 workers.
spmd % Load system and select signals to log load_system('slexAircraftExample') Simulink.sdi.markSignalForStreaming('slexAircraftExample/Pilot', 1, 'on') Simulink.sdi.markSignalForStreaming('slexAircraftExample/Aircraft Dynamics Model', 4, 'on') % Create temporary directory on each worker workDir = pwd; addpath(workDir) tempDir = tempname; mkdir(tempDir) cd(tempDir) end
Выполняйте параллельные симуляции
Использование parfor
чтобы запустить семь параллельные симуляции. Выберите значение для Ts
для каждой симуляции и измените значение Ts
в рабочем пространстве модели. Затем запустите симуляцию и создайте массив Simulink.sdi.WorkerRun
объекты для доступа к данным с помощью Данных моделирования Inspector. После parfor
цикл, используйте другой spmd
сегмент для удаления временных директорий из рабочих процессов.
parfor index = 1:7 % Select value for Ts Ts_val = Ts_vals(index); % Change the filter time constant and simulate modelWorkspace = get_param('slexAircraftExample','modelworkspace'); modelWorkspace.assignin('Ts',Ts_val) sim('slexAircraftExample') % Create a worker run for each simulation workerRun(index) = Simulink.sdi.WorkerRun.getLatest end spmd % Remove temporary directories cd(workDir) rmdir(tempDir, 's') rmpath(workDir) end
Получите объекты набора данных из выхода параллельной симуляции
The getDataset
метод помещает данные из WorkerRun
в Dataset
объект, так что вы можете легко постпроцессировать.
ds(7) = Simulink.SimulationData.Dataset; for a = 1:7 ds(a) = workerRun(a).getDataset; end ds(1)
ans = Simulink.SimulationData.Dataset '' with 2 elements Name BlockPath __________ ________________________________________ 1 [1x1 Signal] alpha, rad ...rcraftExample/Aircraft Dynamics Model 2 [1x1 Signal] Stick slexAircraftExample/Pilot - Use braces { } to access, modify, or add elements using index.
Получите объекты DatasetRef из выхода параллельной симуляции
Для рабочих процессов с большими данными используйте getDatasetRef
метод для ссылки на данные, связанные с WorkerRun
.
for b = 1:7 datasetRef(b) = workerRun(b).getDatasetRef; end datasetRef(1)
ans = DatasetRef with properties: Name: 'Run 3: slexAircraftExample' Run: [1×1 Simulink.sdi.Run] numElements: 2
Обработайте данные параллельного моделирования в Данные моделирования Inspector
Можно также создать локальные Run
объекты для анализа и визуализации данных с помощью Данных моделирования Inspector API. В этом примере добавляется тег, указывающий значение постоянной времени фильтра для каждого запуска.
for c = 1:7 Runs(c) = workerRun(c).getLocalRun; Ts_val_str = num2str(Ts_vals(c)); desc = strcat('Ts = ', Ts_val_str); Runs(c).Description = desc; Runs(c).Name = strcat('slexAircraftExample run Ts=', Ts_val_str); end
Очистка репозиториев рабочих процессов
Очистите файлы, используемые работниками, чтобы освободить пространство на диске для других симуляций, которые необходимо выполнить в рабочем пуле.
Simulink.sdi.cleanupWorkerResources
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.