From 398f0af5f7cf56f3ee0bd80ff7f0cc9b953ea885 Mon Sep 17 00:00:00 2001
From: ratto <ratto@ac1d8469-bf42-47a9-8791-bf33cf982152>
Date: Mon, 20 Apr 2009 12:15:34 +0000
Subject: [PATCH] Generic engines for parallel coding in MATLAB. Isolated
functions so far.
git-svn-id: https://www.dynare.org/svn/dynare/trunk@2612 ac1d8469-bf42-47a9-8791-bf33cf982152
---
matlab/fParallel.m | 38 +++++++++
matlab/masterParallel.m | 168 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 206 insertions(+)
create mode 100644 matlab/fParallel.m
create mode 100644 matlab/masterParallel.m
diff --git a/matlab/fParallel.m b/matlab/fParallel.m
new file mode 100644
index 0000000000..b1a326d5ee
--- /dev/null
+++ b/matlab/fParallel.m
@@ -0,0 +1,38 @@
+
+function fparallel(fblck,nblck,whoiam,ThisMatlab,fname);
+
+
+
+ if (ThisMatlab)
+ dynareroot = dynare_config();
+
+ end
+
+feval(fname,fblck,nblck,whoiam,ThisMatlab);
+
+
+%%% Sincronismo "Esterno" %%%%%%%%%%%%%
+%%% Ogni Processo quando ha finito lo notifica cancellando un file ... Magari Sistemma
+% keyboard;
+if (ThisMatlab)
+ if(whoiam)
+ load([ fname,'_input'],'MasterName','DyMo','options_' )
+ % fid1 = fopen('P',int2str(whoiam),'End.txt','w+');
+ % fclose(fid1);
+ if options_.parallel(ThisMatlab).Local
+
+ delete(['P_',fname,'_',int2str(whoiam),'End.txt']);
+ else
+ delete(['\\',MasterName,'\',DyMo(1),'$\',DyMo(4:end),'\P_',fname,'_',int2str(whoiam),'End.txt']);
+% system (['del \\',MasterName,'\',DyMo(1),'$\',DyMo(4:end),'\P',int2str(whoiam),'End.txt']);
+ end
+ end
+
+end
+
+
+if (ThisMatlab==0)
+ return;
+else
+ exit;
+end
\ No newline at end of file
diff --git a/matlab/masterParallel.m b/matlab/masterParallel.m
new file mode 100644
index 0000000000..a32c27c551
--- /dev/null
+++ b/matlab/masterParallel.m
@@ -0,0 +1,168 @@
+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
--
GitLab