dynare/matlab/masterParallel.m

169 lines
9.0 KiB
Matlab

function [nBlockPerCPU, totCPU] = masterParallel(Parallel,nBlock,NamFileInput,NamFileOutput,fname)
global options_
totCPU=0;
DyMo=pwd;
[tempo, MasterName]=dos('hostname');
MasterName=MasterName(1:end-1);
save([fname,'_input.mat'],'DyMo','MasterName','-append')
for j=1:length(Parallel),
nCPU(j)=length(Parallel(j).NumCPU);
totCPU=totCPU+nCPU(j);
end
nCPU=cumsum(nCPU);
if nBlock>totCPU,
diff = mod(nBlock,totCPU);
nBlockPerCPU(1:diff) = ceil(nBlock/totCPU);
nBlockPerCPU(diff+1:totCPU) = floor(nBlock/totCPU);
else
nBlockPerCPU(1:nBlock)=1;
totCPU = nBlock;
end
if totCPU==1,
if Parallel.Local == 1
State= system (['psexec -W ',DyMo, ' -a ',int2str(Parallel.NumCPU(1)),' -realtime matlab -nosplash -nodesktop -minimize -r fParallel(1,',int2str(nBlock),',1,1,''',fname,''')']);
else
if ~strcmp(Parallel.PcName,MasterName),
delete(['\\',Parallel(1).PcName,'\',Parallel(1).RemoteDrive,'$\',Parallel(1).RemoteFolder,'\*.*']);
adir=ls(['\\',Parallel(1).PcName,'\',Parallel(1).RemoteDrive,'$\',Parallel(1).RemoteFolder,'\']);
for j=3:size(adir,1)
rmdir(['\\',Parallel(1).PcName,'\',Parallel(1).RemoteDrive,'$\',Parallel(1).RemoteFolder,'\',adir(j,:)],'s')
end
end
system (['xcopy ',fname,'_input.mat "\\',Parallel.PcName,'\',Parallel.RemoteDrive,'$\',Parallel.RemoteFolder,'" /Y']);
for j=1:size(NamFileInput,1)
copyfile([NamFileInput{j,1},NamFileInput{j,2}],['\\',Parallel(1).PcName,'\',Parallel(1).RemoteDrive,'$\',Parallel(1).RemoteFolder,'\',NamFileInput{j,1}])
end
State= system (['psexec \\',Parallel.PcName,' -e -u ',Parallel.user,' -p ',Parallel.passwd,' -W ',Parallel.RemoteDrive,':\',Parallel.RemoteFolder,'\ -a ',int2str(Parallel.NumCPU(1)),' -realtime matlab -nosplash -nodesktop -minimize -r fParallel(1,',int2str(nBlock),',1,1,''',fname,''')']);
system (['xcopy "\\',Parallel.PcName,'\',Parallel.RemoteDrive,'$\',Parallel.RemoteFolder,'\',fname,'_output_1.mat" /Y']);
for j=1:size(NamFileOutput,1)
copyfile(['\\',Parallel(1).PcName,'\',Parallel(1).RemoteDrive,'$\',Parallel(1).RemoteFolder,'\',NamFileOutput{j,1},NamFileOutput{j,2}],NamFileOutput{j,1})
end
end
out=load([fname,'_output.mat']);
else
delete(['comp_status_',fname,'*.mat'])
fid = fopen('ConcurrentCommand1.bat','w+');
for j=1:totCPU,
indPC=min(find(nCPU>=j));
if indPC>1
nCPU0 = nCPU(indPC-1);
else
nCPU0=0;
end
offset = sum(nBlockPerCPU(1:j-1));
fid1=fopen(['P_',fname,'_',int2str(j),'End.txt'],'w+');
fclose(fid1);
if Parallel(indPC).Local == 1
% command1=['start /B /affinity ',int2str(Parallel(indPC).NumCPU(j-nCPU0)+1),' /normal matlab -nosplash -nodesktop -minimize -sd ',DyMo, ' -r fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')'];
command1=['start /B psexec -W ',DyMo, ' -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)),' -high matlab -nosplash -nodesktop -minimize -r fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')'];
else
if ~strcmp(Parallel(indPC).PcName,MasterName),
if j==nCPU0+1,
delete(['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\*.*']);
adir=ls(['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\']);
for jdir=3:size(adir,1)
rmdir(['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\',adir(jdir,:)],'s')
end
system (['xcopy ',fname,'_input.mat "\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'" /Y']);
for jfil=1:size(NamFileInput,1)
copyfile([NamFileInput{jfil,1},NamFileInput{jfil,2}],['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\',NamFileInput{jfil,1}])
end
end
command1=['start /B psexec \\',Parallel(indPC).PcName,' -e -u ',Parallel(indPC).user,' -p ',Parallel(indPC).passwd,' -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteFolder,'\ -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)), ...
' -normal matlab -r fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')'];
% ' -normal matlab -nosplash -nodesktop -minimize -r fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')'];
else
command1=['start /B psexec \\',Parallel(indPC).PcName,' -e -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteFolder,'\ -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)), ...
' -normal matlab -nosplash -nodesktop -minimize -r fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')'];
end
% woDy=pwd;
% State= system (['psexec \\',Parallel.PcName,' -i -W ',Parallel.RemoteDrive,':\',Parallel.RemoteFolder,'\ -a 0 -realtime matlab -nosplash -nodesktop -minimize -r fParallel(1,',int2str(nBlock),',0,1)']);
% ' -normal matlab -nosplash -nodesktop -minimize -r fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),')'];
% command2=['start /MIN psexec \\',Parallel.PcName,' -W ', DyMo, ' -a 1 -high matlab -nosplash -nodesktop -minimize -r fParallel(2,2,2,1)'];
% command3=['start /MIN psexec \\',Parallel.PcName,' -W ', DyMo, ' -a 2 -high matlab -nosplash -nodesktop -minimize -r fParallel(3,3,3,1)'];
% command4=['start /wait /MIN psexec \\',Parallel.PcName,' -W ', DyMo, ' -a 3 -high matlab -nosplash -nodesktop -minimize -r fParallel(4,4,4,1)'];
% State= system (['psexec \\',Parallel.PcName,' -i -W ',Parallel.RemoteDrive,':\',Parallel.RemoteFolder,'\ -a 0 -realtime matlab -nosplash -nodesktop -minimize -r fParallel(1,',int2str(nBlock),',0,1)']);
end
fprintf(fid,'%s\n',command1);
end
fclose(fid);
dos('ConcurrentCommand1.bat')
delete ConcurrentCommand1.bat
status_string={'Starting remote parrallel computation ... '};
t0=cputime;
t00=cputime;
hh=NaN(1,nBlock);
while (1)
pause(1)
% if (cputime-t0)>10,
stax = ls(['comp_status_',fname,'*.mat']);
for j=1:size(stax,1),
try
load(stax(j,:))
% status_string{j}=(['Chain ',int2str(whoiam),' at ',num2str(100*jstatus/nruns(whoiam)),'% accept. rate ',num2str(isux/jstatus,4),'.']);
catch
end
% disp(status_string{j})
prtfrc = jstatus/nruns(b);
if ishandle(hh(b)),
waitbar(prtfrc,hh(b),[ '(' int2str(b) '/' int2str(options_.mh_nblck) ') ' sprintf('%f done, acceptation rate %f',prtfrc,isux/jstatus)]);
if prtfrc==1, close(hh(b)); delete(stax(j,:)), end
else
hh(b) = waitbar(0,['Please wait... Metropolis-Hastings (' int2str(b) '/' int2str(options_.mh_nblck) ')...']);
set(hh(b),'Name',['Remote Metropolis-Hastings']);
end
end
% disp(' ')
% t0=cputime;
% end
if isempty(ls(['P_',fname,'_*End.txt']))
delete(['comp_status_',fname,'*.mat'])
for j=1:length(hh),
if ishandle(hh(j)),
close(hh(j))
end
end
for j=1:indPC,
if Parallel(j).Local==0 & ~strcmp(Parallel(indPC).PcName,MasterName),
for jfil = 1:size(NamFileOutput,1)
system (['xcopy "\\',Parallel(j).PcName,'\',Parallel(j).RemoteDrive,'$\',Parallel(j).RemoteFolder,'\',NamFileOutput{jfil,1},NamFileOutput{jfil,2},'" ' ,NamFileOutput{jfil,1},' /Y']);
end
system (['xcopy "\\',Parallel(j).PcName,'\',Parallel(j).RemoteDrive,'$\',Parallel(j).RemoteFolder,'\',fname,'_output_*.mat" /Y']);
end
end
break
end
end
end