parfor-Циклы или spmd ОператорыТело a parfor-цикл или spmd блок должен быть прозрачным. Прозрачность означает, что все ссылки на переменные должны быть видны в тексте кода.
В следующих примерах переменная X не передается работникам. Только вектор символов 'X' передается в eval, и X не отображается как переменный вход в цикле или теле блока. В результате MATLAB® выдает ошибку во время выполнения.
X = 5; parfor ii = 1:4 eval('X'); end |
X = 5; spmd eval('X'); end |
Точно так же вы не можете удалить переменные из рабочей области, выполнив clear внутри parfor или spmd оператор:
parfor ii = 1:4 <statements...> clear('X') % cannot clear: transparency violation <statements...> end |
spmd; clear('X'); end |
Кроме того, можно освободить память, используемую переменной, задав ее значение пустым, когда она больше не нужна.
parfor ii = 1:4 <statements...> X = []; <statements...> end
В случае spmd блоки, можно удалить его Composite из клиентской рабочей области.
В целом требование прозрачности ограничивает все динамические доступы к переменным, поскольку вся переменная может отсутствовать ни в одном из заданных рабочих процессов. В прозрачной рабочей области вы не можете создавать, удалять, изменять, обращаться или запрашивать переменные, если вы явным образом не задаете эти переменные в коде.
Примеры других действий или функций, которые нарушают прозрачность в parfor-цикл включают:
evalc, evalin, и assignin с workspace аргумент задается как 'caller'
save и load, за исключением случаев, когда выход load присваивается переменной
Если скрипт пытается считать или записать переменные родительской рабочей области, то выполнение этого скрипта может вызвать нарушение прозрачности. Чтобы избежать этой проблемы, преобразуйте скрипт в функцию и вызывайте его с необходимыми переменными в качестве входных или выходных аргументов.
Примечание
Прозрачность применяется только к прямому телу parfor или spmd конструкция, а не к каким-либо функциям, вызываемым оттуда. Обходной процесс для save и load чтобы скрыть вызовы к save и load внутри функции.
MATLAB успешно выполняет eval и evalc операторы, которые появляются в функциях, вызываемых из parfor тело.
Можно запустить Simulink® модели параллельно с parsim команда вместо использования parfor-циклы. Для получения дополнительной информации и примеров использования Simulink параллельно, смотрите Запустить Несколько Симуляций (Simulink).
Если ваша модель Simulink требует доступа к переменным, содержащимся в .mat файл, вы должны загрузить эти параметры в рабочую область каждого работника. Вы должны сделать это до parfor-цикл, и после открытия parpool. Для достижения этого можно использовать spmd или parfevalOnAll, как показано на примерах.
spmd evalin('base', 'load(''path/to/file'')') end
parfevalOnAll(@evalin, 0, 'base', 'load(''path/to/file'')')
Если ваша модель также требует переменных, определенных в теле вашего скрипта MATLAB, вы должны использовать assignin или evalin переместить эти переменные в базовое рабочее пространство каждого работника в каждом parfor итерация.