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
итерация.