Обеспечьте прозрачность в 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-цикл включают:

  • who и whos

  • evalc, evalin, и assignin с workspace аргумент задается как 'caller'

  • save и load, за исключением случаев, когда выход load присваивается переменной

  • Если скрипт пытается считать или записать переменные родительской рабочей области, то выполнение этого скрипта может вызвать нарушение прозрачности. Чтобы избежать этой проблемы, преобразуйте скрипт в функцию и вызывайте его с необходимыми переменными в качестве входных или выходных аргументов.

Примечание

Прозрачность применяется только к прямому телу parfor или spmd конструкция, а не к каким-либо функциям, вызываемым оттуда. Обходной процесс для save и load чтобы скрыть вызовы к save и load внутри функции.

MATLAB успешно выполняет eval и evalc операторы, которые появляются в функциях, вызываемых из parfor тело.

Симуляции параллельного Simulink

Можно запустить 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 итерация.

См. также

|

Похожие темы