parfor
- операторы spmd
или циклыТело parfor
- цикл или блок spmd
должно быть прозрачным. Прозрачность означает, что все ссылки на переменные должны быть видимы в тексте кода.
В следующих примерах переменная X
не передается рабочим. Только вектор символов, 'X'
передается eval
и X
, не видим как входная переменная в теле цикла или теле блока. As a result, 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
можно очистить его Составной объект от клиентской рабочей области.
В целом требование для прозрачности ограничивает весь динамический доступ к переменным, потому что целая переменная сила не присутствовать в любом данном рабочем. В прозрачной рабочей области вы не можете создать, удалить, изменить, получить доступ или запросить переменные, если вы явным образом не задаете эти переменные в коде.
Примеры других действий или функций, которые нарушают прозрачность в parfor
- цикл, включают:
evalc
, evalin
и assignin
с аргументом workspace
, заданным как 'caller'
Если скрипт пытается считать или записать переменные родительской рабочей области, то выполнение этого скрипта может вызвать нарушение прозрачности. Чтобы избежать этой проблемы, преобразуйте скрипт в функцию и вызовите его с необходимыми переменными в качестве аргументов ввода или вывода.
Прозрачность применяется только к прямому телу 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
.