diff --git a/matlab/fParallel.m b/matlab/fParallel.m new file mode 100644 index 0000000000000000000000000000000000000000..b1a326d5ee798e22f5fbe63b72cd17cd17607013 --- /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 0000000000000000000000000000000000000000..a32c27c5512e921312c5ac5330d36b09c88afdd3 --- /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