Параллельные вычисления Matlab с моделью Simulink

Я работаю над проектом, в котором параллельные вычисления были бы огромным преимуществом. Проект имитирует несколько Simulink моделей. Я выполнил симуляцию с обычным циклом for, но, поскольку на симуляцию уходит несколько дней, я решил попробовать "parfor"-Loop.

Но тут начинается проблема. Сначала я дам вам фотографии моего кода, рабочей области и Simulink-part, который вызывает у меня проблемы:

Код и рабочее пространство

Из блока рабочей области

Вот мой код:

apool = gcp('nocreate');

if isempty(apool)

apool = parpool('local'); 

end

wpath = pwd;

parfor k = 1:number_of_models  

    load_system(strcat(wpath,'\Models_Folder\',House(k).model_name));
    set_param(House(k).model_name, 'Stoptime', num2str(foreruntime));
    set_param(House(k).mask_name, 'Data_contr', num2str(controlvector(k)));
    set_param(House(k).mask_name, 'Data_cons', strcat('GlobalData(',num2str(k),').consume.',MaskParam(k).consume_input))
    SimOut(k) = sim(House(k).model_name);
end

delete(apool);

Сбивает с толку то, что если я удалю столбец:

 SimOut(k) = sim(House(k).model_name);

код просто отлично работает -> modelparameters установлены в parfor loop

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

Error using Forerunsimple (line 9)

Error evaluating parameter 'Data_cons' in 'model_house_14/House'

Caused by:

    Error using parallel_function>make_general_channel/channel_general (line 907)
    Error evaluating parameter 'Data_cons' in 'model_house_14/House'
    Error using parallel_function>make_general_channel/channel_general (line 907)
    Undefined variable "GlobalData" or class "GlobalData".

Как вы можете видеть на картинке, переменная "GlobalData" определена в рабочей области. Так что на мой взгляд должно работать. Очевидно, что нет. У вас есть идеи, в чем может быть проблема?


person Elias    schedule 10.06.2016    source источник
comment
Привет Элиас, добро пожаловать в SO! Вы сделали хороший пост, но вы должны рассмотреть возможность публикации кода в виде текста в своем вопросе, а не в виде снимка экрана!   -  person J. Chomel    schedule 10.06.2016
comment
Спасибо за помощь :) Конечно, размещение кода в виде текста имеет гораздо больше смысла, я буду иметь это в виду. Я новичок в SO и Matlab-Simulink-Coding, так что простите меня за неосведомленность о некоторых вещах :)   -  person Elias    schedule 10.06.2016
comment
Да, конечно, для меня нет проблем. Старые здесь должны помогать новичкам. Имейте в виду, что некоторые из них жесткие, хотя. Не принимайте обиды на свой счет.   -  person J. Chomel    schedule 10.06.2016


Ответы (1)


вы можете увидеть этот вопрос, ИМХО, он связан и на самом деле может быть той же проблемой:

MATLAB: что происходит для глобальная переменная при работе в параллельном режиме?

Там глобальная переменная рабочей области кажется пустой, даже если она была определена.

пользователь Edric предоставляет ссылку и краткое объяснение того, что глобальные переменные не передаются рабочим процессам (для экземпляр Simulink работает как параллельный).

Ссылка на эту запись в блоге: «Запуск и запуск циклов parfor»: http://blogs.mathworks.com/loren/2009/10/02/using-parfor-loops-getting-up-and-running/

person Henrik    schedule 10.06.2016
comment
Спасибо, Хенрик, я прочитаю вопрос. Но на самом деле я не использую глобальную переменную. Сначала я пытался, но решил, что это плохая идея. Итак, GlobalData — это обычная структура с массивами данных внутри. Забавно то, что я могу получить доступ к файлам GlobalData внутри цикла parfor. Я могу отобразить данные, например, с помощью fprintf внутри цикла parfor. Но если симуляция хочет получить доступ к GlobalData внутри цикла parfor, возникает ошибка:/ - person Elias; 10.06.2016
comment
Я только что прочитал статью и думаю, что это не совсем та же проблема: / Ну, я даже могу сгенерировать переменную с данными внутри цикла parfor, и это не работает. Вот упрощенный пример кода: ›parfor i=1:20 Temp = load('someData.mat') set_param(model, 'Data_cons', 'Temp') simout = sim(model) end по какой-то причине модель не может найти Темп-переменная... - person Elias; 10.06.2016
comment
Хорошо, никогда раньше этого не видел, и в настоящее время у меня нет установки Matlab с лицензией Simulink, так что .. :( - person Henrik; 10.06.2016
comment
Нет проблем. Вот ссылка на более новый вопрос, который упрощен: "> stackoverflow.com/questions/37747380/ - person Elias; 10.06.2016