2015-06-04 2 views
2

Я хотел бы запустить сложную модель Simulink в петле парфоров на многих ядрах с разными данными. Однако у меня пока не было успеха, поэтому я создал простую модель и попытался запустить ее параллельно с теми же данными.Запустить Simulink model parallel

модель выглядит следующим образом, добавив два сигнала: enter image description here С кодом:

function Result = Add (X, Y) 
Result = X + Y; 

Скрипт для запуска модели заключается в следующем:

if matlabpool('size') == 0 
    matlabpool('open',4); 
end 

parfor i = 1:4 
    data=ones(1,20); 
    X=timeseries(data); 
    Y=timeseries(data); 
    output = sim('model_test','StopTime','5'); 
    Result = output.get('Res'); 
end 

Однако, из-за ошибки происходит: enter image description here

Я не понимаю и почему переменные не существуют. Я знаю, что вычисление параллелей всегда имеет решающее значение с точки зрения доступа с переменным доступом, но у меня не было успеха с параллельным запуском simulink. Не могли бы вы объяснить мне ошибку и как ее решить? Большое спасибо!

Ответ на am304: Спасибо, ответ помог мне в пути, что я теперь знаю, как изменить константы с Set_Param в петле parfor, и я понимаю, почему он не работает для таймсерий. Однако для временного периода я все еще борется. Я попробовал несколько вариантов, и это одна:

if matlabpool('size') == 0 
matlabpool('open',4); 
end 

data=ones(1,20); 
X=timeseries(data); 
Ybase=timeseries(data); 

parfor i = 1:4 
    Y = evalin('base', 'Ybase'); 
    output = sim('model_test','StopTime','5'); 
    Result{i} = output.get('Res'); 
end 

Переменная Ybase существует в рабочем пространстве, но следующее сообщение об ошибке:

enter image description here

Как вы видите, переменная Ybase существует в базовое рабочее пространство. Вы знаете, как правильно использовать evalin или assignin для доступа?

Спасибо и приветствую!

ответ

2

Я подозреваю, что это связано с тем, что ваши данные data существуют только в рабочем пространстве основного MATLAB, а не в каких-либо случаях, возбужденных matlabpool на рабочих. Посмотрите Workspace Access Issues в документации для получения более подробной информации о том, как решить эту проблему, с некоторыми примерами, иллюстрирующими два подхода:

Рабочие MATLAB, однако, не имеют доступа к рабочей области клиент сессии MATLAB где загружена модель и связанная с ней рабочая область . Следовательно, если вы загружаете модель и определяете ее связанные переменные рабочей области вне и перед циклом parfor, , то ни модель не загружается, ни переменные рабочей области , определенные в рабочих сеансах MATLAB, где выполняются парные итерации . Это типично, когда вы определяете параметры модели или внешние входы в базовом рабочем пространстве клиентского сеанса. Эти сценарии представляют собой проблемы с доступом к рабочему пространству.

[...] Проблемы

Разрешение Workspace доступа

Когда модель Simulink загружается в память в клиентской сессии MATLAB, это видно только и доступны в этой сессии MATLAB; он недоступен в памяти рабочих сессий MATLAB. Точно так же переменные рабочего пространства , связанные с моделью, которые определены в сеансе клиента MATLAB (такие как параметры и внешние входы), не являются автоматически , доступными в рабочих сеансах. Поэтому вы должны убедиться, что загружена модель и что переменные рабочей области, на которые ссылаются в модели , определены в рабочей сессии MATLAB с использованием следующих методов: .

  • В цикле parfor, использовать команду sim, чтобы загрузить модель и установить параметры, которые изменяются с каждой итерации. (Вариант: нагрузки модель, а затем использовать г (ы) команда et_param (ы), чтобы установить параметров в цикле parfor)
  • В цикле parfor, использовать MATLAB evalin и assignin команды для присвоения значений данных для переменные. Кроме того, вы можете упростить управление переменными рабочей области, определив их в рабочей области модели. Затем эти переменные будут автоматически загружены , когда модель загружена в рабочие сессии. Однако являются ограничениями этого метода. Например, вы не можете настраивать параметры в рабочей области модели. Подробное обсуждение рабочей области модели см. В разделе Model Workspaces.

EDIT

Вот что я хотел бы сделать в вашем конкретном примере:

if matlabpool('size') == 0 
    matlabpool('open',4); 
end 

data=ones(1,20); 
X=timeseries(data); 
Y=timeseries(data); 

parfor i = 1:4 
    assignin('base','Y',Y); 
    output = sim('model_test','StopTime','5'); 
    Result{i} = output.get('Res'); 
end 

Другим вариантом является включение X и Y в модели рабочего пространства, так что модель самоуправления -contained.

+0

Hi am304, спасибо, что ответ! Я пробовал evalin и присваивать, но это не сработало, как хотелось. Вы можете видеть сообщение выше, я сделал там редактирование в качестве ответа. Спасибо и с уважением! – user1956123

+0

См. Мой отредактированный ответ, надеюсь, что он должен работать – am304

Смежные вопросы