2016-06-10 5 views
3

Я задал сегодня вопрос о параллельных вычислениях с Matlab-Simulink. Поскольку мой предыдущий вопрос немного беспорядочен, и в коде есть много вещей, которые действительно не относятся к этой проблеме.Simulink-Simulation с parfor (Parallel Computing)

Моя проблема

Я хочу, чтобы имитировать что-то в parfor-Loop, в то время как мой Simulink-Simulation использует «From Workspace» блок для интеграции необходимых данных из рабочего пространства в моделировании. По какой-то причине он не работает.

Мой код выглядит следующим образом:

load DemoData 
path = pwd; 

apool = gcp('nocreate'); 
if isempty(apool) 
    apool = parpool('local'); 
end 

parfor k = 1 : 2 
    load_system(strcat(path,'\DemoMDL')) 
    set_param('DemoMDL/Mask', 'DataInput', 'DemoData') 


     SimOut(k) = sim('DemoMDL') 
    end 

delete(apool); 

Мой моделирование выглядит следующим образом

DataFromWorkspace

DemoData-File является лишь нули (100,20) -Матрица. Это пример данных.

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

Ошибки

Ошибка при помощи DemoScript (строка 9)

Ошибка вычисления параметра 'DataInput' в «DemoMDL/Маска '

Призрак:

Error using parallel_function>make_general_channel/channel_general (line 907) 
Error evaluating parameter 'DataInput' in 'DemoMDL/Mask' 
    Error using parallel_function>make_general_channel/channel_general (line 907) 

    Undefined function or variable 'DemoData'. 

Теперь у вас есть представление о том, почему это происходит ??

Странно, что если я попытаюсь получить доступ к «DemoData» внутри parfor-Loop, это сработает. Для excample с этим кодом:

load DemoData 
path = pwd; 

apool = gcp('nocreate'); 
if isempty(apool) 
    apool = parpool('local'); 
end 

parfor k = 1 : 2 
    load_system(strcat(path,'\DemoMDL')) 
    set_param('DemoMDL/Mask', 'DataInput', 'DemoData') 
    fprintf(num2str(DemoData)) 
end 

delete(apool); 

Вот мой выход без моделирования и отображения данных

'>>' DemoScript 00000000000000000 .....

Спасибо большое. Это оригинальный вопрос с намного больше (ненужных) деталей:

EarlierQuestion

ответ

2

Ваша ошибка в том, что работники не имеют доступа к DemoData в клиентском рабочем пространстве.

При параллельном моделировании с Simulink было бы проще управлять данными из рабочей области, если вы переместите их в рабочее пространство модели. Затем каждый рабочий может получить доступ к этим данным из рабочей области модели. Вы можете загрузить файл MAT или написать код MATLAB для инициализации данных в рабочей области модели.Вы можете получить доступ к рабочей области модели с помощью меню модели Simulink View-> Model Explorer-> Model Workspace.

Также см. Документацию по адресу http://www.mathworks.com/help/simulink/ug/running-parallel-simulations.html, в которой говорится о «Разрешение вопросов доступа к рабочему пространству».

3

Я подозреваю, что проблема заключается в том, что когда MATLAB предварительно обрабатывает цикл parfor, чтобы определить, какие переменные должны быть переданы рабочим, он не знает, что такое DemoData. В вашем первом примере это всего лишь строка, поэтому никакие данные не отправляются. Во втором примере он явно знает о переменной и, следовательно, передает ее.

Вы можете попробовать либо с помощью модели рабочего пространства, или, возможно, просто вставив линию

DemoData = DemoData;

в коде parfor цикла.

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

  • Нет связанных вопросов^_^