Обеспечьте прозрачность в parfor- Циклы или spmd Операторы

Тело a 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- цикл включает:

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

Смотрите также

|

Похожие темы