这很容易测试,我们将分两个阶段进行。
第 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
在另一个上运行。如果数据是共享的,第二个实例将打印一些东西。这导致(在 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
。