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
блоки, можно очистить его Составной объект от клиентской рабочей области.
В общем случае требование для прозрачности ограничивает весь динамический доступ к переменным, потому что целая переменная сила не присутствовать в любом данном рабочем. В прозрачной рабочей области вы не можете создать, удалить, изменить, получить доступ или запросить переменные, если вы явным образом не задаете эти переменные в коде.
Примеры других действий или функций, которые нарушают прозрачность в 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
итерация.