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;