|
% Start your pool! |
|
% matlabpool open |
|
|
|
%% |
|
% this cell gets details about the pool to find a single worker on |
|
% each physical machine |
|
|
|
% get all hosts and workers |
|
spmd |
|
t = getCurrentWorker(); |
|
ids = labindex; |
|
hosts = get(t,'Host'); |
|
workers = get(t,'Name'); |
|
end |
|
|
|
% convert from spmd objects |
|
ids = {ids{:}}; |
|
hosts = {hosts{:}}; |
|
workers = {workers{:}}; |
|
uniquehosts = unique(hosts); |
|
uniqueworkersidx = zeros(1,length(uniquehosts)); |
|
|
|
for hi=1:length(uniquehosts); |
|
% idx all workers on this host |
|
idx = cellfun(@(x) strcmpi(x, uniquehosts{hi}), hosts); |
|
% just take the first one |
|
uniqueworkersidx(hi) = min(find(idx)); |
|
end |
|
|
|
% setup shared memory on each host |
|
% using only one worker per host |
|
uniqueids = [ids{uniqueworkersidx}]; |
|
|
|
% uniqueids now contains the id of one worker per physical machine |
|
|
|
%% |
|
% set this a unique 5 digit key to identify the shared memory for your |
|
% project |
|
shmkey = 11112; |
|
spmd |
|
% add path to all workers |
|
% this should be a shared drive or somewhere that all workers have access to |
|
% which contains the sharedmatrix package (if not already setup on each worker) |
|
% and your customised clonesharedmemory() function for loading your data set |
|
addpath('/analyse/pilots/robini/code') |
|
addpath('/analyse/pilots/robini/code/sharedmatrix') |
|
% only clone the shared memory on one worker per physical machine |
|
if ismember(labindex, uniqueids) |
|
% clonesharedmemory needs to be a function you write to load |
|
% your data as appropriate |
|
% have to write it as a function to avoid having data in the spmd |
|
% scope which will be transmitted back to the client machine |
|
clonesharedmemory(shmkey) |
|
fprintf(1,'Id %i OK', labindex) |
|
end |
|
end |
|
|
|
%% |
|
% now you can use your shared memory in all your workers |
|
% things go a bit wonky if you don't detach and free properly |
|
% so try to only attach to the big data at the start, extract the slice |
|
% or data you need for that iteration and then detach ASAP |
|
% Don't add the shared stuff until there are no other errors! |
|
xavg = zeros(1,1000); |
|
parfor i=1:1000 |
|
x = sharedmatrix('attach', shmkey); |
|
xavg(i) = mean(x(i,:)); |
|
sharedmatrix('detach', shmkey, x); |
|
end |
|
|
|
|
|
%% |
|
% it might be a good idea to put a sharedmatrix option so you can run |
|
% it with or without for testing... something like this (to give an idea |
|
% - not tested) |
|
%doshared = false; |
|
%parfor i=1:1000 |
|
%if doshared |
|
%x = sharedmatrix('attach',shmkey); |
|
%else |
|
%x = plain_data_load(); |
|
%end |
|
%xavg(i) = mean(x(i,:)); |
|
%if doshared |
|
%sharedmatrix('detach', shmkey, x); |
|
%end |
|
%end |
|
|
|
%% |
|
% remember to free it at the end |
|
% this will give an error if it is already freed |
|
spmd |
|
if ismember(labindex, uniqueids) |
|
sharedmatrix('free',shmkey); |
|
end |
|
end |
|
|
|
%% |
|
% these frees on all workers just to be sure and catches any errors |
|
spmd |
|
try sharedmatrix('free',shmkey);catch,end; |
|
end |