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

  • 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.

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

|

Похожие темы