diff --git a/matlab/closeSlave.m b/matlab/closeSlave.m index f5a507ffd..e2b010196 100644 --- a/matlab/closeSlave.m +++ b/matlab/closeSlave.m @@ -1,4 +1,4 @@ -function closeSlave(Parallel), +function closeSlave(Parallel,TmpFolder), % PARALLEL CONTEXT % In parallel context, this utility closes all remote matlab instances % called by masterParallel with strategy (1) i.e. always open (which leaves @@ -7,8 +7,8 @@ function closeSlave(Parallel), % INPUTS % o Parallel [struct vector] copy of options_.parallel. % -% OUTPUTS -% None +% OUTPUTS +% None % % Copyright (C) 2010 Dynare Team % @@ -27,29 +27,28 @@ function closeSlave(Parallel), % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -try - delete( 'slaveParallel_input*.mat'); +for indPC=1:length(Parallel), + if (Parallel(indPC).Local==0), + dynareParallelDelete( 'slaveParallel_input*.mat',TmpFolder,Parallel(indPC)); + else + delete( 'slaveParallel_input*.mat'); + pause(1) + delete(['slaveParallel_*.log']); + + end +end - for indPC=1:length(Parallel), - if (Parallel(indPC).Local==0), - if isunix || (~matlab_ver_less_than('7.4') && ismac), - system(['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' rm -fr ',Parallel(indPC).RemoteFolder,'/slaveParallel_input*.mat']); - system(['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' rm -fr ',Parallel(indPC).RemoteFolder,'/*']); - else - mydelete('slaveParallel_input*.mat',['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\']); - mydelete('*.*',['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\']); - adir=dir(['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\']); - for jdir=3:length(adir) - STATUS = rmdir(['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\',adir(jdir).name],'s'); - if STATUS == 0, - disp(['Warning!: Directory ',adir(jdir).name,' could not be removed from ',Parallel(indPC).PcName,'.']) - end - end +while(1) + if isempty(dynareParallelDir(['P_slave_',int2str(j),'End.txt'],TmpFolder,Parallel)); + for indPC=1:length(Parallel), + if (Parallel(indPC).Local==0), + dynareParallelRmDir(TmpFolder,Parallel(indPC)), + end end + break + end -catch - % Only for testing, will be remouved! - E1=fopen('Errore1-closeSlave.txt','w+'); - fclose(E1); -end \ No newline at end of file +end + + \ No newline at end of file diff --git a/matlab/distributeJobs.m b/matlab/distributeJobs.m index 31e980da3..2d6b5a9be 100644 --- a/matlab/distributeJobs.m +++ b/matlab/distributeJobs.m @@ -1,4 +1,4 @@ -function [nCPU, totCPU, nBlockPerCPU] = distributeJobs(Parallel, fBlock, nBlock) +function [nCPU, totCPU, nBlockPerCPU, totSLAVES] = distributeJobs(Parallel, fBlock, nBlock) % PARALLEL CONTEXT % In parallel context this function is used to determine the total number of available CPUs, % and the number of threads to run on each CPU. @@ -46,7 +46,9 @@ if (nBlock-offset0)>totCPU, diff = mod((nBlock-offset0),totCPU); nBlockPerCPU(1:diff) = ceil((nBlock-offset0)/totCPU); nBlockPerCPU(diff+1:totCPU) = floor((nBlock-offset0)/totCPU); + totSLAVES=length(Parallel); else nBlockPerCPU(1:nBlock-offset0)=1; totCPU = nBlock-offset0; + totSLAVES = min(find(cumsum(nCPU)>=totCPU)); end diff --git a/matlab/fMessageStatus.m b/matlab/fMessageStatus.m index 41997e323..60ad9dc62 100644 --- a/matlab/fMessageStatus.m +++ b/matlab/fMessageStatus.m @@ -39,11 +39,13 @@ if nargin<5, Parallel.Local=1; end -save(['comp_status_',funcName,int2str(njob),'.mat'],'prtfrc','njob','waitbarString','waitbarTitle'); -if Parallel.Local==0, - if isunix || (~matlab_ver_less_than('7.4') && ismac), - system(['scp comp_status_',funcName,int2str(njob),'.mat ',Parallel.user,'@',MasterName,':',DyMo]); - else - copyfile(['comp_status_',funcName,int2str(njob),'.mat'],['\\',MasterName,'\',DyMo(1),'$\',DyMo(4:end),'\']); - end +try + save(['comp_status_',funcName,int2str(njob),'.mat'],'prtfrc','njob','waitbarString','waitbarTitle'); +catch end + +fslave = dir( ['slaveParallel_input',int2str(njob),'.mat']); +if isempty(fslave), + error('Master asked to break the job') +end + diff --git a/matlab/fParallel.m b/matlab/fParallel.m index 473682d62..a43a176df 100644 --- a/matlab/fParallel.m +++ b/matlab/fParallel.m @@ -5,15 +5,15 @@ function fParallel(fblck,nblck,whoiam,ThisMatlab,fname) % computing task itself. % % INPUTS -% o fblck [int] index number of the first thread to run in this +% o fblck [int] index number of the first thread to run in this % MATLAB instance -% o nblck [int] number of threads to run in this +% o nblck [int] number of threads to run in this % MATLAB instance -% o whoiam [int] index number of this CPU among all CPUs in the +% o whoiam [int] index number of this CPU among all CPUs in the % cluster -% o ThisMatlab [int] index number of this slave machine in the cluster +% o ThisMatlab [int] index number of this slave machine in the cluster % (entry in options_.parallel) -% o fname [string] function to be run, containing the computing task +% o fname [string] function to be run, containing the computing task % % OUTPUTS % None @@ -46,11 +46,10 @@ delete( [fname,'_',int2str(whoiam),'.log']); diary( [fname,'_',int2str(whoiam),'.log']); - -% configure dynare environment +% Configure dynare environment. dynareroot = dynare_config(); -% Load input data +% Load input data. load( [fname,'_input']) if exist('fGlobalVar') && ~isempty (fGlobalVar) @@ -60,67 +59,52 @@ if exist('fGlobalVar') && ~isempty (fGlobalVar) evalin('base',['global ',globalVars{j},';']) end struct2local(fGlobalVar); - % create global variables in the base workspace as well - evalin('base',['load( [''',fname,'_input''],''fGlobalVar'')']) + % Create global variables in the base workspace as well. + evalin('base',['load( [''',fname,'_input''],''fGlobalVar'')']) evalin('base','struct2local(fGlobalVar)'); end -% On UNIX, mount the master working directory through SSH FS -% if (isunix | (~matlab_ver_less_than('7.4') & ismac) ) & Parallel(ThisMatlab).Local==0, -% system(['mkdir ~/MasterRemoteMirror_',fname,'_',int2str(whoiam)]); -% system(['sshfs ',Parallel(ThisMatlab).user,'@',fInputVar.MasterName,':/',fInputVar.DyMo,' ~/MasterRemoteMirror_',fname,'_',int2str(whoiam)]); -% end - -% Special hack for MH directory: possibly no longer needed ?????? now all -% files are managed locally and sent backwards later on in this routine! -% if isfield(fInputVar,'MhDirectoryName') & Parallel(ThisMatlab).Local==0, -% if isunix | (~matlab_ver_less_than('7.4') & ismac), -% fInputVar.MhDirectoryName = ['~/MasterRemoteMirror_',fname,'_',int2str(whoiam),'/',fInputVar.MhDirectoryName]; -% else -% fInputVar.MhDirectoryName = ['\\',fInputVar.MasterName,'\',fInputVar.DyMo(1),'$\',fInputVar.DyMo(4:end),'\',fInputVar.MhDirectoryName]; -% end -% end fInputVar.Parallel = Parallel; -% Launch the routine to be run in parallel -tic, -% keyboard; -fOutputVar = feval(fname, fInputVar ,fblck, nblck, whoiam, ThisMatlab); -toc, -if isfield(fOutputVar,'OutputFileName'), - OutputFileName = fOutputVar.OutputFileName; -else - OutputFileName = ''; -end -if(whoiam) - - % Save the output result - save([ fname,'_output_',int2str(whoiam),'.mat'],'fOutputVar' ) - - % Inform the master that the job is finished, and transfer the output data - if Parallel(ThisMatlab).Local - delete(['P_',fname,'_',int2str(whoiam),'End.txt']); + +% Launch the routine to be run in parallel. + +try, + tic, + + fOutputVar = feval(fname, fInputVar ,fblck, nblck, whoiam, ThisMatlab); + toc, + if isfield(fOutputVar,'OutputFileName'), + OutputFileName = fOutputVar.OutputFileName; else - if isunix || (~matlab_ver_less_than('7.4') && ismac), - for j=1:size(OutputFileName,1), - system(['scp ',OutputFileName{j,1},OutputFileName{j,2},' ',Parallel(ThisMatlab).user,'@',fInputVar.MasterName,':',fInputVar.DyMo,'/',OutputFileName{j,1}]); - end - system(['scp ',fname,'_output_',int2str(whoiam),'.mat ',Parallel(ThisMatlab).user,'@',fInputVar.MasterName,':',fInputVar.DyMo]); - system(['ssh ',Parallel(ThisMatlab).user,'@',fInputVar.MasterName,' rm -f ',fInputVar.DyMo,'/P_',fname,'_',int2str(whoiam),'End.txt']); -% system(['fusermount -u ~/MasterRemoteMirror_',fname,'_',int2str(whoiam)]); -% system(['rm -r ~/MasterRemoteMirror_',fname,'_',int2str(whoiam)]); - else - for j=1:size(OutputFileName,1), - copyfile([OutputFileName{j,1},OutputFileName{j,2}],['\\',fInputVar.MasterName,'\',fInputVar.DyMo(1),'$\',fInputVar.DyMo(4:end),'\',OutputFileName{j,1}]) - end - copyfile([fname,'_output_',int2str(whoiam),'.mat'],['\\',fInputVar.MasterName,'\',fInputVar.DyMo(1),'$\',fInputVar.DyMo(4:end)]); - delete(['\\',fInputVar.MasterName,'\',fInputVar.DyMo(1),'$\',fInputVar.DyMo(4:end),'\P_',fname,'_',int2str(whoiam),'End.txt']); - end + OutputFileName = ''; end + if(whoiam) + + % Save the output result. + + save([ fname,'_output_',int2str(whoiam),'.mat'],'fOutputVar' ) + + end + + disp(['fParallel ',int2str(whoiam),' completed.']) +catch ME + disp(['fParallel ',int2str(whoiam),' crashed.']) + fOutputVar.error = ME; + save([ fname,'_output_',int2str(whoiam),'.mat'],'fOutputVar' ) + waitbarString = fOutputVar.error.message; + % waitbarTitle=['Metropolis-Hastings ',options_.parallel(ThisMatlab).PcName]; + if Parallel(ThisMatlab).Local, + waitbarTitle='Local '; + else + waitbarTitle=[Parallel(ThisMatlab).PcName]; + end + fMessageStatus(NaN,whoiam,waitbarString, waitbarTitle, Parallel(ThisMatlab)); + end - -disp(['fParallel ',int2str(whoiam),' completed.']) diary off; +delete(['P_',fname,'_',int2str(whoiam),'End.txt']); + exit; diff --git a/matlab/global_initialization.m b/matlab/global_initialization.m index b0b8186dc..6359dac8e 100644 --- a/matlab/global_initialization.m +++ b/matlab/global_initialization.m @@ -196,6 +196,7 @@ options_.plot_priors = 1; options_.cova_compute = 1; options_.parallel = 0; options_.parallel_info.leaveSlaveOpen = 0; +options_.parallel_info.RemoteTmpFolder = ''; options_.number_of_grid_points_for_kde = 2^9; quarter = 1; years = [1 2 3 4 5 10 20 30 40 50]; diff --git a/matlab/masterParallel.m b/matlab/masterParallel.m index eafef2054..1a45bb638 100644 --- a/matlab/masterParallel.m +++ b/matlab/masterParallel.m @@ -1,22 +1,22 @@ -function [fOutVar,nBlockPerCPU, totCPU] = masterParallel(Parallel,fBlock,nBlock,NamFileInput,fname,fInputVar,fGlobalVar,Parallel_info) +function [fOutVar,nBlockPerCPU, totCPU] = masterParallel(Parallel,fBlock,nBlock,NamFileInput,fname,fInputVar,fGlobalVar,Parallel_info,initialize) % PARALLEL CONTEXT % This is the most important function for the management of DYNARE parallel % computing. % It is the top-level function called on the master computer when parallelizing a task. -% This function have two main computational startegy for manage the matlab worker (slave process). +% This function have two main computational startegy for manage the matlab worker (slave process). % 0 Simple Close/Open Stategy: - % In this case the new matlab istances (slave process) are open when - % necessary and then closed. This can happen many times during the - % simulation of a model. +% In this case the new matlab istances (slave process) are open when +% necessary and then closed. This can happen many times during the +% simulation of a model. % 1 Alway Open Stategy: - % In this case we have a more sophisticated management of slave processes, - % which are no longer closed at the end of each job. The slave processes - % waits for a new job (if exist). If a slave do not receives a new job after a - % fixed time it is destroyed. This solution removes the computational - % time necessary to Open/Close new matlab istances. +% In this case we have a more sophisticated management of slave processes, +% which are no longer closed at the end of each job. The slave processes +% waits for a new job (if exist). If a slave do not receives a new job after a +% fixed time it is destroyed. This solution removes the computational +% time necessary to Open/Close new matlab istances. % The first (point 0) is the default Strategy % i.e.(Parallel_info.leaveSlaveOpen=0). This value can be changed by the @@ -70,42 +70,60 @@ function [fOutVar,nBlockPerCPU, totCPU] = masterParallel(Parallel,fBlock,nBlock, % along with Dynare. If not, see . -% Fix the strategy to be used. - Strategy=-1; -if ~isempty(Parallel_info) - Strategy=Parallel_info.leaveSlaveOpen; -end +% If islocal==0, create a new directory for remote computation. +% This directory is named using current data and time, +% is used only one time and then deleted. + +persistent PRCDir +% PRCDir= Present Remote Computational Directory! + +Strategy=Parallel_info.leaveSlaveOpen; + +islocal = 0; +for j=1:length(Parallel), + islocal=islocal+Parallel(j).Local; +end +if nargin>8 && initialize==1 + if islocal == 0, + PRCDir=CreateTimeString(); + assignin('base','PRCDirTmp',PRCDir), + evalin('base','options_.parallel_info.RemoteTmpFolder=PRCDirTmp;') + evalin('base','clear PRCDirTmp,') + else + % Delete the traces (if exists) of last local section computations. + if Strategy==1, + mydelete(['slaveParallel_input*.mat']); + end + end + return +end + + for j=1:length(Parallel), if isempty(Parallel(j).MatlabPath), Parallel(j).MatlabPath = 'matlab'; end end -if Strategy==0 - disp('User Strategy Now Is Open/Close (0)'); -else - disp('User Strategy Now Is Always Open (1)'); -end - + +% if Strategy==0 +% disp('User Strategy Now Is Open/Close (0)'); +% else +% disp('User Strategy Now Is Always Open (1)'); +% end + if Strategy==1 - % Delete the traces (if exists) of last section computations. - persistent initialize - if isempty(initialize), - mydelete(['P_slave_*End.txt']); - mydelete(['slaveParallel_input*.mat']); - initialize = 0; - pause(1), - end - totCPU=0; + totCPU=0; end + % Determine my hostname and my working directory. + DyMo=pwd; fInputVar.DyMo=DyMo; if isunix || (~matlab_ver_less_than('7.4') && ismac) , -% [tempo, MasterName]=system(['ifconfig | grep ''inet addr:''| grep -v ''127.0.0.1'' | cut -d: -f2 | awk ''{ print $1}''']); [tempo, MasterName]=system('hostname --fqdn'); -else +else [tempo, MasterName]=system('hostname'); end MasterName=deblank(MasterName); @@ -113,44 +131,52 @@ fInputVar.MasterName = MasterName; % Save input data for use by the slaves. switch Strategy - case 0 - if exist('fGlobalVar'), - save([fname,'_input.mat'],'fInputVar','fGlobalVar') - else - save([fname,'_input.mat'],'fInputVar') - end - save([fname,'_input.mat'],'Parallel','-append') - + case 0 + if exist('fGlobalVar'), + save([fname,'_input.mat'],'fInputVar','fGlobalVar') + else + save([fname,'_input.mat'],'fInputVar') + end + save([fname,'_input.mat'],'Parallel','-append') + case 1 - if exist('fGlobalVar'), - save(['temp_input.mat'],'fInputVar','fGlobalVar') - else - save(['temp_input.mat'],'fInputVar') - end - save(['temp_input.mat'],'Parallel','-append') + if exist('fGlobalVar'), + save(['temp_input.mat'],'fInputVar','fGlobalVar') + else + save(['temp_input.mat'],'fInputVar') + end + save(['temp_input.mat'],'Parallel','-append') end % Determine the total number of available CPUs, and the number of threads % to run on each CPU. - [nCPU, totCPU, nBlockPerCPU] = distributeJobs(Parallel, fBlock, nBlock); - offset0 = fBlock-1; - +[nCPU, totCPU, nBlockPerCPU, totSlaves] = distributeJobs(Parallel, fBlock, nBlock); +offset0 = fBlock-1; + % Clean up remnants of previous runs. mydelete(['comp_status_',fname,'*.mat']) -mydelete(['P_',fname,'*End.txt']); + % Create a shell script containing the commands to launch the required tasks on the slaves fid = fopen('ConcurrentCommand1.bat','w+'); + + +% Creo la directory in cui effettuare i calcoli in remoto ... +if isempty(PRCDir) && ~islocal, + error('PRCDir not initialized!') +else + dynareParallelMkDir(PRCDir,Parallel(1:totSlaves)); +end + for j=1:totCPU, if Strategy==1 command1 = ' '; end - indPC=min(find(nCPU>=j)); @@ -161,254 +187,178 @@ for j=1:totCPU, end offset = sum(nBlockPerCPU(1:j-1))+offset0; + + % Creo un file che mi serve per sapere se la computazione di un + % blocco parallelo (una core) è terminata oppure no! + fid1=fopen(['P_',fname,'_',int2str(j),'End.txt'],'w+'); fclose(fid1); - if Strategy==1 - fblck = offset+1; - nblck = sum(nBlockPerCPU(1:j)); - save temp_input fblck nblck fname -append; - copyfile('temp_input.mat',['slaveJob',int2str(j),'.mat']) - if Parallel(indPC).Local ==0, + if Strategy==1, + + fblck = offset+1; + nblck = sum(nBlockPerCPU(1:j)); + save temp_input fblck nblck fname -append; + copyfile('temp_input.mat',['slaveJob',int2str(j),'.mat']) + if Parallel(indPC).Local ==0, fid1=fopen(['stayalive',int2str(j),'.txt'],'w+'); fclose(fid1); - if isunix || (~matlab_ver_less_than('7.4') && ismac), - system(['scp stayalive',int2str(j),'.txt ',Parallel(indPC).user,'@',Parallel(indPC).PcName,':',Parallel(indPC).RemoteFolder]); - else - copyfile(['stayalive',int2str(j),'.txt'], ['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder]); - end - mydelete(['stayalive',int2str(j),'.txt'],'w+'); - end - % Wait for possibly local alive CPU to start the new job or close by - % internal criteria. - pause(1); + dynareParallelSendFiles(['stayalive',int2str(j),'.txt'],PRCDir,Parallel(indPC)); + mydelete(['stayalive',int2str(j),'.txt']); + end + % Wait for possibly local alive CPU to start the new job or close by + % internal criteria. + pause(1); newInstance = 0; - % Check if j CPU is already alive. - if isempty( dir(['P_slave_',int2str(j),'End.txt'])); + % Check if j CPU is already alive. + if isempty(dynareParallelDir(['P_slave_',int2str(j),'End.txt'],PRCDir,Parallel(indPC))); fid1=fopen(['P_slave_',int2str(j),'End.txt'],'w+'); fclose(fid1); + if Parallel(indPC).Local==0, + dynareParallelSendFiles(['P_slave_',int2str(j),'End.txt'],PRCDir,Parallel(indPC)); + delete(['P_slave_',int2str(j),'End.txt']); + end + newInstance = 1; storeGlobalVars( ['slaveParallel_input',int2str(j)]); save( ['slaveParallel_input',int2str(j)],'Parallel','-append'); % Prepare global vars for Slave. end - end - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % The following 'switch - case' code is the core of this function! - switch Strategy - case 0 - - if Parallel(indPC).Local == 1, %Run on the local machine (localhost). - if isunix || (~matlab_ver_less_than('7.4') && ismac), - if exist('OCTAVE_VERSION') - command1=['octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')" &']; - else - command1=[Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r "addpath(''',Parallel(indPC).DynarePath,'''), fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')" &']; - end - else - if exist('OCTAVE_VERSION') - command1=['start /B psexec -W ',DyMo, ' -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)),' -low octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; - else - command1=['start /B psexec -W ',DyMo, ' -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)),' -low ',Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r "addpath(''',Parallel(indPC).DynarePath,'''), fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; - end - end - else % Parallel(indPC).Local==0: Run using network on remote machine or also on local machine. - if isunix || (~matlab_ver_less_than('7.4') && ismac), - %[tempo, RemoteName]=system(['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' "ifconfig | grep \''inet addr:\''| grep -v \''127.0.0.1\'' | cut -d: -f2 | awk \''{ print $1}\''"']); - [tempo, RemoteName]=system(['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' "hostname --fqdn"']); - RemoteName=RemoteName(1:end-1); - RemoteFolder = Parallel(indPC).RemoteFolder; - else - RemoteName = Parallel(indPC).PcName; - RemoteFolder = [Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteFolder]; - end + else - remoteFlag=1; + % Se la computazione è remota, lo creo in locale, lo copio directory remota (creata + % sopra) e lo cancello in locale. Lo stesso vale per gli altri + % dati. + save( ['slaveParallel_input',int2str(j)],'Parallel'); + + if Parallel(indPC).Local==0, + dynareParallelSendFiles(['P_',fname,'_',int2str(j),'End.txt'],PRCDir,Parallel(indPC)); + delete(['P_',fname,'_',int2str(j),'End.txt']); + + dynareParallelSendFiles(['slaveParallel_input',int2str(j),'.mat'],PRCDir,Parallel(indPC)); + delete(['slaveParallel_input',int2str(j),'.mat']); + + end - if strcmpi(RemoteName,MasterName), - if ~copyfile(['P_',fname,'_',int2str(j),'End.txt'],RemoteFolder), - remoteFlag=0; + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % The following 'switch - case' code is the core of this function! + switch Strategy + case 0 + + if Parallel(indPC).Local == 1, %Run on the local machine (localhost). + + if isunix || (~matlab_ver_less_than('7.4') && ismac), + if exist('OCTAVE_VERSION') + command1=['octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')" &']; + else + command1=[Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r "addpath(''',Parallel(indPC).DynarePath,'''), fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')" &']; + end + else + if exist('OCTAVE_VERSION') + command1=['start /B psexec -W ',DyMo, ' -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)),' -low octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; + else + command1=['start /B psexec -W ',DyMo, ' -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)),' -low ',Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r "addpath(''',Parallel(indPC).DynarePath,'''), fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; + end + end + else % Parallel(indPC).Local==0: Run using network on remote machine or also on local machine. + if j==nCPU0+1, + dynareParallelSendFiles([fname,'_input.mat'],PRCDir,Parallel(indPC)); + dynareParallelSendFiles(NamFileInput,PRCDir,Parallel(indPC)); + end + + if isunix || (~matlab_ver_less_than('7.4') && ismac), + if exist('OCTAVE_VERSION'), + command1=['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' "cd ',Parallel(indPC).RemoteFolder,'/',PRCDir, '; octave --eval \"addpath(''',Parallel(indPC).DynarePath,'''), fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''');\" " &']; + else + command1=['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' "cd ',Parallel(indPC).RemoteFolder,'/',PRCDir, '; ',Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r \"addpath(''',Parallel(indPC).DynarePath,'''), fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''');\" " &']; + end + else + if ~strcmp(Parallel(indPC).PcName,MasterName), % Run on a remote machine! + if exist('OCTAVE_VERSION'), + command1=['start /B psexec \\',Parallel(indPC).PcName,' -e -u ',Parallel(indPC).user,' -p ',Parallel(indPC).passwd,' -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteFolder,'\',PRCDir,'\ -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)), ... + ' -low octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; + else + command1=['start /B psexec \\',Parallel(indPC).PcName,' -e -u ',Parallel(indPC).user,' -p ',Parallel(indPC).passwd,' -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteFolder,'\',PRCDir,'\ -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)), ... + ' -low ',Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r "addpath(''',Parallel(indPC).DynarePath,'''), fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; + end + else % Run on the local machine via the network + if exist('OCTAVE_VERSION'), + command1=['start /B psexec \\',Parallel(indPC).PcName,' -e -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteFolder,'\',PRCDir,'\ -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)), ... + ' -low octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), 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,'\',PRCDir,'\ -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)), ... + ' -low ',Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r "addpath(''',Parallel(indPC).DynarePath,'''), fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; + end + end end end - if remoteFlag, - if j==nCPU0+1, - if isunix || (~matlab_ver_less_than('7.4') && ismac), - system(['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' rm -fr ',Parallel(indPC).RemoteFolder,'/*']); + + + case 1 + if Parallel(indPC).Local == 1 & newInstance, % Run on the local machine. + if isunix || (~matlab_ver_less_than('7.4') && ismac), + if exist('OCTAVE_VERSION') + %command1=['octave --eval fParallel\(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',\''',fname,'\''\) &']; + command1=['octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), slaveParallel(',int2str(j),',',int2str(indPC),')" &']; else - mydelete('*.*',['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\']); - adir=dir(['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\']); - for jdir=3:length(adir) - STATUS = rmdir(['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\',adir(jdir).name],'s'); - if STATUS == 0, - disp(['Warning!: Directory ',adir(jdir).name,' could not be removed from ',Parallel(indPC).PcName,'.']) + %command1=[Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r fParallel\(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',\''',fname,'\''\) &']; + command1=[Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r "addpath(''',Parallel(indPC).DynarePath,'''), slaveParallel(',int2str(j),',',int2str(indPC),')" &']; + end + else + if exist('OCTAVE_VERSION') + %command1=['start /B psexec -W ',DyMo, ' -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)),' -low octave --eval 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)),' -low octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), slaveParallel(',int2str(j),',',int2str(indPC),')"']; + else + %command1=['start /B psexec -W ',DyMo, ' -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)),' -low ',Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -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)),' -low ',Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r "addpath(''',Parallel(indPC).DynarePath,'''), slaveParallel(',int2str(j),',',int2str(indPC),')"']; + end + end + elseif Parallel(indPC).Local==0, % Run using network on remote machine or also on local machine. + dynareParallelSendFiles(['P_',fname,'_',int2str(j),'End.txt'],PRCDir,Parallel(indPC)); + dynareParallelSendFiles(['slaveJob',int2str(j),'.mat'],PRCDir,Parallel(indPC)); + if j==nCPU0+1, + dynareParallelSendFiles(NamFileInput,PRCDir,Parallel(indPC)); + end + if newInstance, + dynareParallelSendFiles(['slaveParallel_input',int2str(j),'.mat'],PRCDir,Parallel(indPC)) + if isunix || (~matlab_ver_less_than('7.4') && ismac), + if exist('OCTAVE_VERSION'), + command1=['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' "cd ',Parallel(indPC).RemoteFolder,'/',PRCDir '; octave --eval \"addpath(''',Parallel(indPC).DynarePath,'''), slaveParallel(',int2str(j),',',int2str(indPC),');\" " &']; + else + command1=['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' "cd ',Parallel(indPC).RemoteFolder,'/',PRCDir '; ',Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r \"addpath(''',Parallel(indPC).DynarePath,'''), slaveParallel(',int2str(j),',',int2str(indPC),');\" " &']; + end + else + if ~strcmp(Parallel(indPC).PcName,MasterName), % Run on a remote machine. + if exist('OCTAVE_VERSION'), + command1=['start /B psexec \\',Parallel(indPC).PcName,' -e -u ',Parallel(indPC).user,' -p ',Parallel(indPC).passwd,' -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteFolder,'\',PRCDir,'\ -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)), ... + ' -low octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), slaveParallel(',int2str(j),',',int2str(indPC),')"']; + else + command1=['start /B psexec \\',Parallel(indPC).PcName,' -e -u ',Parallel(indPC).user,' -p ',Parallel(indPC).passwd,' -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteFolder,'\',PRCDir,'\ -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)), ... + ' -low ',Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r "addpath(''',Parallel(indPC).DynarePath,'''), slaveParallel(',int2str(j),',',int2str(indPC),')"']; + end + else % Run on the local machine via the network. + if exist('OCTAVE_VERSION'), + command1=['start /B psexec \\',Parallel(indPC).PcName,' -e -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteFolder,'\',PRCDir,'\ -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)), ... + ' -low octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), slaveParallel(',int2str(j),',',int2str(indPC),')"']; + else + command1=['start /B psexec \\',Parallel(indPC).PcName,' -e -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteFolder,'\',PRCDir,'\ -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)), ... + ' -low ',Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r "addpath(''',Parallel(indPC).DynarePath,'''), slaveParallel(',int2str(j),',',int2str(indPC),')"']; end end end - if isunix || (~matlab_ver_less_than('7.4') && ismac), - system(['scp ',fname,'_input.mat ',Parallel(indPC).user,'@',Parallel(indPC).PcName,':',Parallel(indPC).RemoteFolder]); - for jfil=1:size(NamFileInput,1) - if ~isempty(NamFileInput{jfil,1}) - system(['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' mkdir -p ',Parallel(indPC).RemoteFolder,'/',NamFileInput{jfil,1}]) - end - system(['scp ',NamFileInput{jfil,1},NamFileInput{jfil,2},' ',Parallel(indPC).user,'@',Parallel(indPC).PcName,':',Parallel(indPC).RemoteFolder,'/',NamFileInput{jfil,1}]); - end - else - copyfile([fname,'_input.mat'], ['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder]); - for jfil=1:size(NamFileInput,1), - if ~isempty(NamFileInput{jfil,1}) - mkdir(['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\',NamFileInput{jfil,1}]); - end - copyfile([NamFileInput{jfil,1},NamFileInput{jfil,2}],['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\',NamFileInput{jfil,1}]) - end - end - end - end - - if isunix || (~matlab_ver_less_than('7.4') && ismac), - if exist('OCTAVE_VERSION'), - command1=['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' "cd ',Parallel(indPC).RemoteFolder, '; octave --eval \"addpath(''',Parallel(indPC).DynarePath,'''), fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''');\" " &']; - else - command1=['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' "cd ',Parallel(indPC).RemoteFolder, '; ',Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r \"addpath(''',Parallel(indPC).DynarePath,'''), fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''');\" " &']; - end - else - if ~strcmp(Parallel(indPC).PcName,MasterName), % Run on a remote machine! - if exist('OCTAVE_VERSION'), - 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)), ... - ' -low octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; - else - 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)), ... - ' -low ',Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r "addpath(''',Parallel(indPC).DynarePath,'''), fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; - end - else % Run on the local machine via the network - if exist('OCTAVE_VERSION'), - command1=['start /B psexec \\',Parallel(indPC).PcName,' -e -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteFolder,'\ -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)), ... - ' -low octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), 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)), ... - ' -low ',Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r "addpath(''',Parallel(indPC).DynarePath,'''), fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; end end - end - end - + + end + + fprintf(fid,'%s\n',command1); - case 1 - if Parallel(indPC).Local == 1 & newInstance, % run on the local machine - if isunix || (~matlab_ver_less_than('7.4') && ismac), - if exist('OCTAVE_VERSION') - %command1=['octave --eval fParallel\(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',\''',fname,'\''\) &']; - command1=['octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), slaveParallel(',int2str(j),',',int2str(indPC),')" &']; - else - %command1=[Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r fParallel\(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',\''',fname,'\''\) &']; - command1=[Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r "addpath(''',Parallel(indPC).DynarePath,'''), slaveParallel(',int2str(j),',',int2str(indPC),')" &']; - end - else - if exist('OCTAVE_VERSION') - %command1=['start /B psexec -W ',DyMo, ' -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)),' -low octave --eval 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)),' -low octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), slaveParallel(',int2str(j),',',int2str(indPC),')"']; - else - %command1=['start /B psexec -W ',DyMo, ' -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)),' -low ',Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -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)),' -low ',Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r "addpath(''',Parallel(indPC).DynarePath,'''), slaveParallel(',int2str(j),',',int2str(indPC),')"']; - end - end - - elseif Parallel(indPC).Local==0 %Run using network on remote machine or also on local machine. - if isunix || (~matlab_ver_less_than('7.4') && ismac), - %[tempo, RemoteName]=system(['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' "ifconfig | grep \''inet addr:\''| grep -v \''127.0.0.1\'' | cut -d: -f2 | awk \''{ print $1}\''"']); - [tempo, RemoteName]=system(['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' "hostname --fqdn"']); - RemoteName=RemoteName(1:end-1); - RemoteFolder = Parallel(indPC).RemoteFolder; - else - RemoteName = Parallel(indPC).PcName; - RemoteFolder = [Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteFolder]; - end - - remoteFlag=1; - - if strcmpi(RemoteName,MasterName), - if ~copyfile(['P_',fname,'_',int2str(j),'End.txt'],RemoteFolder), - remoteFlag=0; - end - end - if remoteFlag, - if (j==nCPU0+1) & newInstance, % Clean remote folder! - if isunix || (~matlab_ver_less_than('7.4') && ismac), - system(['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' rm -fr ',Parallel(indPC).RemoteFolder,'/*']); - else - mydelete('*.*',['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\']); - adir=dir(['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\']); - for jdir=3:length(adir) - STATUS = rmdir(['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\',adir(jdir).name],'s'); - if STATUS == 0, - disp(['Warning!: Directory ',adir(jdir).name,' could not be removed from ',Parallel(indPC).PcName,'.']) - end - end - end - end - - if isunix || (~matlab_ver_less_than('7.4') && ismac), - % system(['scp ',fname,'_input.mat ',Parallel(indPC).user,'@',Parallel(indPC).PcName,':',Parallel(indPC).RemoteFolder]); - for jfil=1:size(NamFileInput,1) - if ~isempty(NamFileInput{jfil,1}) - system(['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' mkdir -p ',Parallel(indPC).RemoteFolder,'/',NamFileInput{jfil,1}]) - end - system(['scp ',NamFileInput{jfil,1},NamFileInput{jfil,2},' ',Parallel(indPC).user,'@',Parallel(indPC).PcName,':',Parallel(indPC).RemoteFolder,'/',NamFileInput{jfil,1}]); - end - system(['scp slaveJob',int2str(j),'.mat ',Parallel(indPC).user,'@',Parallel(indPC).PcName,':',Parallel(indPC).RemoteFolder]); - if newInstance, - system(['scp slaveParallel_input',int2str(j),'.mat ',Parallel(indPC).user,'@',Parallel(indPC).PcName,':',Parallel(indPC).RemoteFolder]); - end - else - %copyfile([fname,'_input.mat'], ['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder]) - for jfil=1:size(NamFileInput,1) - if ~isempty(NamFileInput{jfil,1}) - mkdir(['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\',NamFileInput{jfil,1}]); - end - copyfile([NamFileInput{jfil,1},NamFileInput{jfil,2}],['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\',NamFileInput{jfil,1}]) - end - copyfile(['slaveJob',int2str(j),'.mat'], ['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder]); - if newInstance, - copyfile(['slaveParallel_input',int2str(j),'.mat'], ['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder]); - end - end - end - - if newInstance, - if isunix || (~matlab_ver_less_than('7.4') && ismac), - if exist('OCTAVE_VERSION'), - command1=['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' "cd ',Parallel(indPC).RemoteFolder, '; octave --eval \"addpath(''',Parallel(indPC).DynarePath,'''), slaveParallel(',int2str(j),',',int2str(indPC),');\" " &']; - else - command1=['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' "cd ',Parallel(indPC).RemoteFolder, '; ',Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r \"addpath(''',Parallel(indPC).DynarePath,'''), slaveParallel(',int2str(j),',',int2str(indPC),');\" " &']; - end - else - if ~strcmp(Parallel(indPC).PcName,MasterName), % Run on a remote machine. - if exist('OCTAVE_VERSION'), - 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)), ... - ' -low octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), slaveParallel(',int2str(j),',',int2str(indPC),')"']; - else - 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)), ... - ' -low ',Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r "addpath(''',Parallel(indPC).DynarePath,'''), slaveParallel(',int2str(j),',',int2str(indPC),')"']; - end - else % Run on the local machine via the network. - if exist('OCTAVE_VERSION'), - command1=['start /B psexec \\',Parallel(indPC).PcName,' -e -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteFolder,'\ -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)), ... - ' -low octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), slaveParallel(',int2str(j),',',int2str(indPC),')"']; - else - command1=['start /B psexec \\',Parallel(indPC).PcName,' -e -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteFolder,'\ -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)), ... - ' -low ',Parallel(indPC).MatlabPath,' -nosplash -nodesktop -minimize -r "addpath(''',Parallel(indPC).DynarePath,'''), slaveParallel(',int2str(j),',',int2str(indPC),')"']; - end - end - end - end - end - end - - fprintf(fid,'%s\n',command1); - - end - fclose(fid); + +fclose(fid); % Run the slaves. if isunix || (~matlab_ver_less_than('7.4') && ismac), @@ -418,6 +368,7 @@ else system('ConcurrentCommand1.bat'); end + % Wait for the slaves to finish their job, and display some progress % information meanwhile. @@ -427,92 +378,186 @@ if exist('OCTAVE_VERSION'), printf('\n'); else hfigstatus = figure('name',['Parallel ',fname],... - 'MenuBar', 'none', ... - 'NumberTitle','off'); + 'DockControls','off', ... + 'IntegerHandle','off', ... + 'Interruptible','off', ... + 'MenuBar', 'none', ... + 'NumberTitle','off', ... + 'Renderer','Painters', ... + 'Resize','off'); + vspace = 0.1; ncol = ceil(totCPU/10); hspace = 0.9/ncol; + hstatus(1) = axes('position',[0.05/ncol 0.92 0.9/ncol 0.03], ... + 'box','on','xtick',[],'ytick',[],'xlim',[0 1],'ylim',[0 1]); + set(hstatus(1),'Units','pixels') + hpixel = get(hstatus(1),'Position'); + hfigure = get(hfigstatus,'Position'); + hfigure(4)=hpixel(4)*10/3*min(10,totCPU); + set(hfigstatus,'Position',hfigure) + set(hstatus(1),'Units','normalized'), + vspace = max(0.1,1/totCPU); + vstart = 1-vspace+0.2*vspace; for j=1:totCPU, jrow = mod(j-1,10)+1; - jcol = ceil(j/10); - hstatus(j) = axes('position',[0.05/ncol+(jcol-1)/ncol 0.92-vspace*(jrow-1) 0.9/ncol 0.03], ... - 'box','on','xtick',[],'ytick',[],'xlim',[0 1],'ylim',[0 1]); + jcol = ceil(j/10); + hstatus(j) = axes('position',[0.05/ncol+(jcol-1)/ncol vstart-vspace*(jrow-1) 0.9/ncol 0.3*vspace], ... + 'box','on','xtick',[],'ytick',[],'xlim',[0 1],'ylim',[0 1]); + hpat(j) = patch([0 0 0 0],[0 1 1 0],'r','EdgeColor','r'); + htit(j) = title(['Initialize ...']); + end + cumBlockPerCPU = cumsum(nBlockPerCPU); end pcerdone = NaN(1,totCPU); -while (1) +idCPU = NaN(1,totCPU); + +delete(['comp_status_',fname,'*.mat']); + +ForEver=1; + +while (ForEver) waitbarString = ''; statusString = ''; - pause(1) - stax = dir(['comp_status_',fname,'*.mat']); - for j=1:length(stax), + + pause(1) + + try + if Parallel(indPC).Local ==0, + dynareParallelGetFiles(['comp_status_',fname,'*.mat'],PRCDir,Parallel(1:totSlaves)); + end + catch + end + +% stax = dir(['comp_status_',fname,'*.mat']); + for j=1:totCPU, %length(stax), try - load(stax(j).name) + if ~isempty(['comp_status_',fname,int2str(j),'.mat']) + load(['comp_status_',fname,int2str(j),'.mat']);% (stax(j).name) + end pcerdone(j) = prtfrc; + idCPU(j) = njob; if exist('OCTAVE_VERSION'), statusString = [statusString, int2str(j), ' %3.f%% done! ']; else - status_String{j} = waitbarString; - status_Title{j} = waitbarTitle; - idCPU(j) = njob; + status_String{j} = waitbarString; + status_Title{j} = waitbarTitle; end - if prtfrc==1, delete(stax(j).name), end +% if prtfrc==1, delete(stax(j).name), end catch - if j>1 - j=j-1 - end + pcerdone(j) = NaN; + idCPU(j) = NaN; +% if j>1 +% j=j-1; +% end end end if exist('OCTAVE_VERSION'), printf([statusString,'\r'], 100 .* pcerdone); else - figure(hfigstatus), - for j=1:length(stax) + for j=1:totCPU, %length(stax) try - axes(hstatus(idCPU(j))), - hpat = findobj(hstatus(idCPU(j)),'Type','patch'); - if ~isempty(hpat), - set(hpat,'XData',[0 0 pcerdone(j) pcerdone(j)]) + set(hpat(j),'XData',[0 0 pcerdone(j) pcerdone(j)]); + set(htit(j),'String',[status_Title{j},' - ',status_String{j}]); + catch ME + + end + end + end + + + + if isempty(dynareParallelDir(['P_',fname,'_*End.txt'],PRCDir,Parallel(1:totSlaves))); + HoTuttiGliOutput=0; + for j=1:totCPU, + if ~isempty(dynareParallelDir([fname,'_output_',int2str(j),'.mat'],PRCDir,Parallel(1:totSlaves))) + HoTuttiGliOutput=HoTuttiGliOutput+1; + end + end + if HoTuttiGliOutput==totCPU, + + mydelete(['comp_status_',fname,'*.mat']) + if ~exist('OCTAVE_VERSION'), + close(hfigstatus), else - patch([0 0 pcerdone(j) pcerdone(j)],[0 1 1 0],'r','EdgeColor','r') + printf('\n'); + diary on; end - title([status_Title{j},' - ',status_String{j}]); - catch - if j>1 - j=j-1 - end - end - end - end - if isempty(dir(['P_',fname,'_*End.txt'])) - mydelete(['comp_status_',fname,'*.mat']) - if ~exist('OCTAVE_VERSION'), - close(hfigstatus), + + break else - printf('\n'); - diary on; + disp('Waiting for output files from slaves ...') end - break end + end + +dynareParallelGetFiles([fname,'_output_*.mat'],PRCDir,Parallel(1:totSlaves)); + + % Create return value. for j=1:totCPU, load([fname,'_output_',int2str(j),'.mat'],'fOutputVar'); delete([fname,'_output_',int2str(j),'.mat']); + if isfield(fOutputVar,'OutputFileName'), + dynareParallelGetFiles([fOutputVar.OutputFileName],PRCDir,Parallel(1:totSlaves)); + end + if isfield(fOutputVar,'error'), + disp(['Job number ',int2str(j),'crashed with error:']); + error([fOutputVar.error.message]); + end fOutVar(j)=fOutputVar; end -% Cleanup. +pause(1), % wait for all remote diary off completed + +% Cleanup. (Only if the computing is executed remotly). +dynareParallelGetFiles('*.log',PRCDir,Parallel(1:totSlaves)); + switch Strategy - case 0 - delete([fname,'_input.mat']) - case 1 - delete(['temp_input.mat']) -end + case 0 + for indPC=1:length(Parallel) + if Parallel(indPC).Local == 0 + dynareParallelRmDir(PRCDir,Parallel(indPC)); + end + + if isempty(dir('dynareParallelLogFiles')) + [A B C]=rmdir('dynareParallelLogFiles'); + mkdir('dynareParallelLogFiles'); + end + + copyfile('*.log','dynareParallelLogFiles'); + delete([fname,'*.log']); + + %%%%%%%% E' GIUSTO??? %%%%%%%%%%%%% + mydelete(['*_core*_input*.mat']); + if Parallel(indPC).Local == 1 + delete(['slaveParallel_input*.mat']); + end + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + end -delete ConcurrentCommand1.bat + delete ConcurrentCommand1.bat + case 1 + delete(['temp_input.mat']) + if newInstance, + if isempty(dir('dynareParallelLogFiles')) + [A B C]=rmdir('dynareParallelLogFiles'); + mkdir('dynareParallelLogFiles'); + end + end + copyfile('*.log','dynareParallelLogFiles'); + if newInstance, + delete ConcurrentCommand1.bat + end +end + + + diff --git a/matlab/masterParallelMan.m b/matlab/masterParallelMan.m deleted file mode 100644 index fca03849f..000000000 --- a/matlab/masterParallelMan.m +++ /dev/null @@ -1,368 +0,0 @@ -function [fOutVar,nBlockPerCPU, totCPU] = masterParallelMan(Parallel,fBlock,nBlock,NamFileInput,fname,fInputVar,fGlobalVar) -% Top-level function called on the master computer when parallelizing a task. -% This version has amore sophisticated management of slave processes, -% which are no longer closed at the end of each job -% -% The number of parallelized threads will be equal to (nBlock-fBlock+1). -% -% INPUTS -% Parallel [struct vector] copy of options_.parallel -% fBlock [int] index number of the first thread -% (between 1 and nBlock) -% nBlock [int] index number of the last thread -% NamFileInput [cell array] containins the list of input files to be -% copied in the working directory of remote slaves -% 2 columns, as many lines as there are files -% - first column contains directory paths -% - second column contains filenames -% fname [string] name of the function to be parallelized, and -% which will be run on the slaves -% fInputVar [struct] structure containing local variables to be used -% by fName on the slaves -% fGlobalVar [struct] structure containing global variables to be used -% by fName on the slaves -% -% OUTPUT -% fOutVar [struct vector] result of the parallel computation, one -% struct per thread -% nBlockPerCPU [int vector] for each CPU used, indicates the number of -% threads run on that CPU -% totCPU [int] total number of CPU used (can be lower than -% the number of CPU declared in "Parallel", if -% the number of required threads is lower) - -% Copyright (C) 2009-2010 Dynare Team -% -% This file is part of Dynare. -% -% Dynare is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% (at your option) any later version. -% -% Dynare is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with Dynare. If not, see . - -% Delete the traces (if exists) of last section computations. -persistent initialize - -if isempty(initialize), - mydelete(['P_slave_*End.txt']); - mydelete(['slaveParallel_input*.mat']); - initialize = 0; - pause(1), -end - -totCPU=0; - -% Determine my hostname and my working directory - -DyMo=pwd; -fInputVar.DyMo=DyMo; -if isunix || (~matlab_ver_less_than('7.4') && ismac) , - % [tempo, MasterName]=system(['ifconfig | grep ''inet addr:''| grep -v ''127.0.0.1'' | cut -d: -f2 | awk ''{ print $1}''']); - [tempo, MasterName]=system('hostname --fqdn'); -else - [tempo, MasterName]=system('hostname'); -end - -MasterName=deblank(MasterName); -fInputVar.MasterName = MasterName; - -% Save input data for use by the slaves -if exist('fGlobalVar'), - save(['temp_input.mat'],'fInputVar','fGlobalVar') -else - save(['temp_input.mat'],'fInputVar') -end -save(['temp_input.mat'],'Parallel','-append') - -% Determine the total number of available CPUs, and the number of threads to run on each CPU -for j=1:length(Parallel), - nCPU(j)=length(Parallel(j).NumCPU); - totCPU=totCPU+nCPU(j); -end - -nCPU=cumsum(nCPU); -offset0 = fBlock-1; -if (nBlock-offset0)>totCPU, - diff = mod((nBlock-offset0),totCPU); - nBlockPerCPU(1:diff) = ceil((nBlock-offset0)/totCPU); - nBlockPerCPU(diff+1:totCPU) = floor((nBlock-offset0)/totCPU); -else - nBlockPerCPU(1:nBlock-offset0)=1; - totCPU = nBlock-offset0; -end - -% Clean up remnants of previous runs -mydelete(['comp_status_',fname,'*.mat']) -mydelete(['P_',fname,'*End.txt']); - -% Create a shell script containing the commands to launch the required tasks on the slaves -fid = fopen('ConcurrentCommand1.bat','w+'); -for j=1:totCPU, - command1 = ' '; - - indPC=min(find(nCPU>=j)); - - if indPC>1 - nCPU0 = nCPU(indPC-1); - else - nCPU0=0; - end - offset = sum(nBlockPerCPU(1:j-1))+offset0; - - fid1=fopen(['P_',fname,'_',int2str(j),'End.txt'],'w+'); - fclose(fid1); - fblck = offset+1; - nblck = sum(nBlockPerCPU(1:j)); - save temp_input fblck nblck fname -append; - copyfile('temp_input.mat',['slaveJob',int2str(j),'.mat']) - if Parallel(indPC).Local ==0, - fid1=fopen(['stayalive',int2str(j),'.txt'],'w+'); - fclose(fid1); - if isunix || (~matlab_ver_less_than('7.4') && ismac), - system(['scp stayalive',int2str(j),'.txt ',Parallel(indPC).user,'@',Parallel(indPC).PcName,':',Parallel(indPC).RemoteFolder]); - else - copyfile(['stayalive',int2str(j),'.txt'], ['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder]); - end - mydelete(['stayalive',int2str(j),'.txt'],'w+'); - end - pause(1); % wait for possibly local alive CPU to start the new job or close by internal criteria - newInstance = 0; - - if isempty( dir(['P_slave_',int2str(j),'End.txt'])); % check if j CPU is already alive - fid1=fopen(['P_slave_',int2str(j),'End.txt'],'w+'); - fclose(fid1); - newInstance = 1; - storeGlobalVars( ['slaveParallel_input',int2str(j)]); - save( ['slaveParallel_input',int2str(j)],'Parallel','-append'); - % prepare global vars for Slave - end - - if Parallel(indPC).Local == 1 & newInstance, % run on the local machine - if isunix || (~matlab_ver_less_than('7.4') && ismac), - if exist('OCTAVE_VERSION') - % command1=['octave --eval fParallel\(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',\''',fname,'\''\) &']; - command1=['octave --eval slaveParallel\(',int2str(j),',',int2str(indPC),'\) &']; - else - % command1=['matlab -nosplash -nodesktop -minimize -r fParallel\(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',\''',fname,'\''\) &']; - command1=['matlab -nosplash -nodesktop -minimize -r slaveParallel\(',int2str(j),',',int2str(indPC),'\) &']; - end - else - if exist('OCTAVE_VERSION') - % command1=['start /B psexec -W ',DyMo, ' -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)),' -low octave --eval 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)),' -low octave --eval slaveParallel(',int2str(j),',',int2str(indPC),')']; - else - % command1=['start /B psexec -W ',DyMo, ' -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)),' -low matlab -nosplash -nodesktop -minimize -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)),' -low matlab -nosplash -nodesktop -minimize -r slaveParallel(',int2str(j),',',int2str(indPC),')']; - end - end - elseif Parallel(indPC).Local==0, - if isunix || (~matlab_ver_less_than('7.4') && ismac), - % [tempo, RemoteName]=system(['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' "ifconfig | grep \''inet addr:\''| grep -v \''127.0.0.1\'' | cut -d: -f2 | awk \''{ print $1}\''"']); - [tempo, RemoteName]=system(['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' "hostname --fqdn"']); - RemoteName=RemoteName(1:end-1); - RemoteFolder = Parallel(indPC).RemoteFolder; - else - RemoteName = Parallel(indPC).PcName; - RemoteFolder = [Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteFolder]; - end - - remoteFlag=1; - - if strcmpi(RemoteName,MasterName), - if ~copyfile(['P_',fname,'_',int2str(j),'End.txt'],RemoteFolder), - remoteFlag=0; - end - end - if remoteFlag, - if (j==nCPU0+1) & newInstance, % clean remote folder - if isunix || (~matlab_ver_less_than('7.4') && ismac), - system(['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' rm -fr ',Parallel(indPC).RemoteFolder,'/*']); - else - mydelete('*.*',['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\']); - adir=dir(['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\']); - for jdir=3:length(adir) - STATUS = rmdir(['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\',adir(jdir).name],'s'); - if STATUS == 0, - disp(['Warning!: Directory ',adir(jdir).name,' could not be removed from ',Parallel(indPC).PcName,'.']) - end - end - end - end - - if isunix || (~matlab_ver_less_than('7.4') && ismac), - % system(['scp ',fname,'_input.mat ',Parallel(indPC).user,'@',Parallel(indPC).PcName,':',Parallel(indPC).RemoteFolder]); - for jfil=1:size(NamFileInput,1) - if ~isempty(NamFileInput{jfil,1}) - system(['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' mkdir -p ',Parallel(indPC).RemoteFolder,'/',NamFileInput{jfil,1}]) - end - system(['scp ',NamFileInput{jfil,1},NamFileInput{jfil,2},' ',Parallel(indPC).user,'@',Parallel(indPC).PcName,':',Parallel(indPC).RemoteFolder,'/',NamFileInput{jfil,1}]); - end - system(['scp slaveJob',int2str(j),'.mat ',Parallel(indPC).user,'@',Parallel(indPC).PcName,':',Parallel(indPC).RemoteFolder]); - if newInstance, - system(['scp slaveParallel_input',int2str(j),'.mat ',Parallel(indPC).user,'@',Parallel(indPC).PcName,':',Parallel(indPC).RemoteFolder]); - end - else - % copyfile([fname,'_input.mat'], ['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder]) - for jfil=1:size(NamFileInput,1) - if ~isempty(NamFileInput{jfil,1}) - mkdir(['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\',NamFileInput{jfil,1}]); - end - copyfile([NamFileInput{jfil,1},NamFileInput{jfil,2}],['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder,'\',NamFileInput{jfil,1}]) - end - copyfile(['slaveJob',int2str(j),'.mat'], ['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder]); - if newInstance, - copyfile(['slaveParallel_input',int2str(j),'.mat'], ['\\',Parallel(indPC).PcName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteFolder]); - end - end - end - - if newInstance, - if isunix || (~matlab_ver_less_than('7.4') && ismac), - if exist('OCTAVE_VERSION'), - command1=['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' "cd ',Parallel(indPC).RemoteFolder, '; octave --eval slaveParallel\(',int2str(j),',',int2str(indPC),'\);" &']; - else - command1=['ssh ',Parallel(indPC).user,'@',Parallel(indPC).PcName,' "cd ',Parallel(indPC).RemoteFolder, '; matlab -nosplash -nodesktop -minimize -r slaveParallel\(',int2str(j),',',int2str(indPC),'\);" &']; - end - else - if ~strcmp(Parallel(indPC).PcName,MasterName), % run on a remote machine - if exist('OCTAVE_VERSION'), - 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)), ... - ' -low octave --eval slaveParallel(',int2str(j),',',int2str(indPC),')']; - else - 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)), ... - ' -low matlab -nosplash -nodesktop -minimize -r slaveParallel(',int2str(j),',',int2str(indPC),')']; - end - else % run on the local machine via the network - if exist('OCTAVE_VERSION'), - command1=['start /B psexec \\',Parallel(indPC).PcName,' -e -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteFolder,'\ -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)), ... - ' -low octave --eval slaveParallel(',int2str(j),',',int2str(indPC),')']; - else - command1=['start /B psexec \\',Parallel(indPC).PcName,' -e -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteFolder,'\ -a ',int2str(Parallel(indPC).NumCPU(j-nCPU0)), ... - ' -low matlab -nosplash -nodesktop -minimize -r slaveParallel(',int2str(j),',',int2str(indPC),')']; - end - end - end - end - end - fprintf(fid,'%s\n',command1); -end - -fclose(fid); - -% Run the slaves -if isunix || (~matlab_ver_less_than('7.4') && ismac), - system('sh ConcurrentCommand1.bat &'); - pause(1) -else - system('ConcurrentCommand1.bat'); -end - -% Wait for the slaves to finish their job, and display some progress information meanwhile -t0=cputime; -t00=cputime; -hh=NaN(1,nBlock); -if exist('OCTAVE_VERSION'), - diary off; - printf('\n'); -else - hfigstatus = figure('name',['Parallel ',fname],... - 'MenuBar', 'none', ... - 'NumberTitle','off'); - vspace = 0.1; - ncol = ceil(totCPU/10); - hspace = 0.9/ncol; - for j=1:totCPU, - jrow = mod(j-1,10)+1; - jcol = ceil(j/10); - hstatus(j) = axes('position',[0.05/ncol+(jcol-1)/ncol 0.92-vspace*(jrow-1) 0.9/ncol 0.03], ... - 'box','on','xtick',[],'ytick',[],'xlim',[0 1],'ylim',[0 1]); - end - cumBlockPerCPU = cumsum(nBlockPerCPU); -end -pcerdone = NaN(1,totCPU); -while (1) - - waitbarString = ''; - statusString = ''; - pause(1) - - stax = dir(['comp_status_',fname,'*.mat']); - - for j=1:length(stax), - - try - load(stax(j).name) - pcerdone(j) = prtfrc; - if exist('OCTAVE_VERSION'), - statusString = [statusString, int2str(j), ' %3.f%% done! ']; - else - status_String{j} = waitbarString; - status_Title{j} = waitbarTitle; - idCPU(j) = njob; - end - if prtfrc==1, delete(stax(j).name), end - catch - - end - end - if exist('OCTAVE_VERSION'), - printf([statusString,'\r'], 100 .* pcerdone); - else - - figure(hfigstatus), - try - for j=1:length(stax) - - axes(hstatus(idCPU(j))), - hpat = findobj(hstatus(idCPU(j)),'Type','patch'); - - - if ~isempty(hpat), - set(hpat,'XData',[0 0 pcerdone(j) pcerdone(j)]) - else - patch([0 0 pcerdone(j) pcerdone(j)],[0 1 1 0],'r','EdgeColor','r') - end - title([status_Title{j},' - ',status_String{j}]); - - end - catch - - E='ERRORE in while cycle masterParallelMann!' - j - if j>1 - j=j-1 - end - j - end - - end - if isempty(dir(['P_',fname,'_*End.txt'])) - mydelete(['comp_status_',fname,'*.mat']) - if ~exist('OCTAVE_VERSION'), - close(hfigstatus), - else - printf('\n'); - diary on; - end - break - end -end - -% Create return value -for j=1:totCPU, - load([fname,'_output_',int2str(j),'.mat'],'fOutputVar'); - delete([fname,'_output_',int2str(j),'.mat']); - fOutVar(j)=fOutputVar; -end - -% Cleanup -delete([fname,'_input.mat']) -delete ConcurrentCommand1.bat diff --git a/matlab/slaveParallel.m b/matlab/slaveParallel.m index af6adab38..7c0a50835 100644 --- a/matlab/slaveParallel.m +++ b/matlab/slaveParallel.m @@ -126,6 +126,7 @@ while (etime(clock,t0)<1200 && ~isempty(fslave)) || ~isempty(dir(['stayalive',in fInputVar.Parallel = Parallel; % Launch the routine to be run in parallel. + try, tic, fOutputVar = feval(fname, fInputVar ,fblck, nblck, whoiam, ThisMatlab); toc, @@ -141,43 +142,35 @@ while (etime(clock,t0)<1200 && ~isempty(fslave)) || ~isempty(dir(['stayalive',in save([ fname,'_output_',int2str(whoiam),'.mat'],'fOutputVar' ) % Inform the master that the job is finished, and transfer the output data - if Parallel(ThisMatlab).Local - delete(['P_',fname,'_',int2str(whoiam),'End.txt']); - else - if isunix || (~matlab_ver_less_than('7.4') && ismac), - for j=1:size(OutputFileName,1), - system(['scp ',OutputFileName{j,1},OutputFileName{j,2},' ',Parallel(ThisMatlab).user,'@',fInputVar.MasterName,':',fInputVar.DyMo,'/',OutputFileName{j,1}]); - end - system(['scp ',fname,'_output_',int2str(whoiam),'.mat ',Parallel(ThisMatlab).user,'@',fInputVar.MasterName,':',fInputVar.DyMo]); - system(['ssh ',Parallel(ThisMatlab).user,'@',fInputVar.MasterName,' rm -f ',fInputVar.DyMo,'/P_',fname,'_',int2str(whoiam),'End.txt']); - % system(['fusermount -u ~/MasterRemoteMirror_',fname,'_',int2str(whoiam)]); - % system(['rm -r ~/MasterRemoteMirror_',fname,'_',int2str(whoiam)]); - else - for j=1:size(OutputFileName,1), - copyfile([OutputFileName{j,1},OutputFileName{j,2}],['\\',fInputVar.MasterName,'\',fInputVar.DyMo(1),'$\',fInputVar.DyMo(4:end),'\',OutputFileName{j,1}]) - end - copyfile([fname,'_output_',int2str(whoiam),'.mat'],['\\',fInputVar.MasterName,'\',fInputVar.DyMo(1),'$\',fInputVar.DyMo(4:end)]); - delete(['\\',fInputVar.MasterName,'\',fInputVar.DyMo(1),'$\',fInputVar.DyMo(4:end),'\P_',fname,'_',int2str(whoiam),'End.txt']); - end - end + delete(['P_',fname,'_',int2str(whoiam),'End.txt']); end disp(['Job ',fname,' on CPU ',int2str(whoiam),' completed.']) - t0 =clock; % re-set waiting time of 20 mins + t0 =clock; % Re-set waiting time of 20 mins + catch ME + disp(['Job ',fname,' on CPU ',int2str(whoiam),' crashed.']) + fOutputVar.error = ME; + save([ fname,'_output_',int2str(whoiam),'.mat'],'fOutputVar' ) + waitbarString = fOutputVar.error.message; + if Parallel(ThisMatlab).Local, + waitbarTitle='Local '; + else + waitbarTitle=[Parallel(ThisMatlab).PcName]; + end + fMessageStatus(NaN,whoiam,waitbarString, waitbarTitle, Parallel(ThisMatlab)); + delete(['P_',fname,'_',int2str(whoiam),'End.txt']); + break + + end end - fslave = dir( ['slaveParallel_input',int2str(whoiam),'.mat']); % check if Master asks to exit + fslave = dir( ['slaveParallel_input',int2str(whoiam),'.mat']); % Check if Master asks to exit end -if Parallel(ThisMatlab).Local - delete(['P_slave_',int2str(whoiam),'End.txt']); -else - if isunix || (~matlab_ver_less_than('7.4') && ismac), - system(['ssh ',Parallel(ThisMatlab).user,'@',fInputVar.MasterName,' rm -f ',fInputVar.DyMo,'/P_slave_',int2str(whoiam),'End.txt']); - else - delete(['\\',fInputVar.MasterName,'\',fInputVar.DyMo(1),'$\',fInputVar.DyMo(4:end),'\P_slave_',int2str(whoiam),'End.txt']); - end -end disp(['slaveParallel on CPU ',int2str(whoiam),' completed.']) diary off; + +delete(['P_slave_',int2str(whoiam),'End.txt']); + + exit;