Распространяются ли данные приложения между работниками в параллельном пуле?

Я работаю над сложной функцией, которая вызывает несколько подфункций (в одном файле). Для передачи данных setappdata/getappdata. Более того, некоторые подфункции содержат persistent переменных (инициализируются один раз, чтобы впоследствии сохранить вычисления).

Я рассматривал возможность выполнения этой функции на нескольких воркерах в параллельном пуле, но забеспокоился, что может произойти непреднамеренный обмен данными (который в противном случае был бы уникальным для каждого воркера).

Мой вопрос: как узнать, являются ли данные в global и/или persistent и/или appdata общими для рабочих процессов или уникальными для каждого из них?

Несколько, возможно, релевантных вещей:

  1. В моем случае задачи полностью параллельны и их результаты никак не должны влиять друг на друга (распараллеливание делается просто для экономии времени).
  2. Временные файлы или папки не создаются, поэтому нет риска, что один работник по ошибке прочитает файлы, оставленные другим.
  3. Все переменные persistent и appdata создаются/назначаются внутри подфункции parfor.

Я знаю, что каждому рабочему процессу соответствует новый процесс с собственным пространством памяти (и, предположительно, рабочим пространством global/persistent/appdata). На основании этого и этого официального комментария, я бы сказал, что, вероятно, такого обмена не происходит... Но как мы можем это установить?

Сопутствующий материал:

  1. Вопросы и ответы.
  2. Эта страница документации.

person Dev-iL    schedule 03.10.2018    source источник
comment
Мне нечего добавить к моему официальному комментарию (!) - но в любом случае все global, persistent, appdata не распределяется между рабочими процессами Parallel Computing Toolbox. (Обычно люди хотят, чтобы это было так.)   -  person Edric    schedule 03.10.2018
comment
@ Эдрик Спасибо за ваш комментарий. Поскольку у вас есть тег [ПЕРСОНАЛ] на MA, это настолько официально, насколько это возможно. :)   -  person Dev-iL    schedule 03.10.2018


Ответы (1)


Меня укусило еще одно непредоставление данных.

Постоянные переменные даже не копируются из текущей рабочей области в рабочие.

Для демонстрации создается простая функция с постоянной переменной (MATLAB 2017a):

function [ output_args ] = testPersist( input_args )
%TESTPERSIST Simple persistent variable test.

persistent var

if (isempty(var))
    var = 0;
end
if (nargin == 1)
    var = input_args;
end

output_args = var;

end

И выполняется короткий скрипт:

testPersist(123); % Set persistent variable to 123.
tpData = zeros(100,1);
parfor i = 1 : 100
    tpData(i) = testPersist;
    testPersist(i);
end
any(tpData == 0) % This implies the worker started from 0 instead of 123 as specified in the first row.

Вывод 1 - рабочие проигнорировали 123 из родительской рабочей области и начали заново.

Проверка значений в tpData дополнительно показывает, как каждый рабочий выполнял свою работу, отмечая, например, «tpData (14) = 15 - это означает, что рабочий, который завершил 15, продолжил работу с 14 следующими»

Таким образом, создание рабочего процесса = создание совершенно нового экземпляра MATLAB, совершенно не связанного с экземпляром MATLAB, который вы открыли перед собой. На каждого работника отдельно.

Урок, который я извлек из этого = не используйте простые постоянные переменные в качестве файла конфигурации моделирования. Он работал нормально и выглядел элегантно, пока не использовался парфор... но потом ужасно сломался. Используйте объекты.

person Zizy Archer    schedule 03.10.2018