Это довольно просто проверить, и мы сделаем это в два этапа.
Шаг 1: Ручное порождение "рабочих"
Сначала создайте эти 3 функции:
%% Worker 1:
function q52623266_W1
global a; a = 5;
setappdata(0, 'a', a);
someFuncInSameFolder();
end
%% Worker 2:
function q52623266_W2
global a; disp(a);
disp(getappdata(0,'a'));
someFuncInSameFolder();
end
function someFuncInSameFolder()
persistent b;
if isempty(b)
b = 10;
disp('b is now set!');
else
disp(b);
end
end
Затем мы загружаем 2 экземпляра MATLAB (представляющих двух разных работников параллельного пула), затем запускаем q52623266_W1
на одном из них, ожидаем, пока онзакончить и запустить q52623266_W2
на другом.Если данные являются общими, экземпляр 2 nd что-то напечатает.В результате (на R2018b):
>> q52623266_W1
b is now set!
>> q52623266_W2
b is now set!
Это означает, что данные не передаются.Пока все хорошо, но можно задаться вопросом, представляет ли это фактический параллельный пул.Таким образом, мы можем немного скорректировать наши функции и перейти к следующему шагу.
Шаг 2: Автоматическое порождение рабочих
function q52623266_Host
spmd(2)
if labindex == 1
setupData();
end
labBarrier; % make sure that the setup stage was executed.
if labindex == 2
readData();
end
end
end
function setupData
global a; a = 5;
setappdata(0, 'a', a);
someFunc();
end
function readData
global a; disp(a);
disp(getappdata(0,'a'));
someFunc();
end
function someFunc()
persistent b;
if isempty(b)
b = 10;
disp('b is now set!');
else
disp(b);
end
end
Запустив вышеизложенное, мы получим:
>> q52623266_Host
Starting parallel pool (parpool) using the 'local' profile ...
connected to 2 workers.
Lab 1:
b is now set!
Lab 2:
b is now set!
Что снова означает, что данные не передаются .Обратите внимание, что на втором шаге мы использовали spmd
, который должен функционировать аналогично parfor
для целей этого теста.