diff --git a/matlab/parallel/masterParallel.m b/matlab/parallel/masterParallel.m index fe32cfcf400b63341e7c64e2e86240a970052293..5b790243bb8317ec0443a0f5150eb5772e649d02 100644 --- a/matlab/parallel/masterParallel.m +++ b/matlab/parallel/masterParallel.m @@ -71,7 +71,6 @@ function [fOutVar,nBlockPerCPU, totCPU] = masterParallel(Parallel,fBlock,nBlock, % along with Dynare. If not, see <http://www.gnu.org/licenses/>. - % 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. @@ -101,7 +100,6 @@ if nargin>8 && initialize==1 end - % Deactivate some 'Parallel/Warning' message in Octave! % Comment the line 'warning('off');' in order to view the warning message % in Octave! @@ -111,16 +109,6 @@ if exist('OCTAVE_VERSION'), end - -% Only for testing! - -% if Strategy==0 -% disp('User Strategy Now Is Open/Close (0)'); -% else -% disp('User Strategy Now Is Always Open (1)'); -% end - - if Strategy==1 totCPU=0; end @@ -139,21 +127,21 @@ end % 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 1 - if exist('fGlobalVar'), - save(['temp_input.mat'],'fInputVar','fGlobalVar') - else - save(['temp_input.mat'],'fInputVar') - end - save(['temp_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') end @@ -161,24 +149,15 @@ end % to run on each CPU. [nCPU, totCPU, nBlockPerCPU, totSlaves] = distributeJobs(Parallel, fBlock, nBlock); +for j=1:totSlaves, + PRCDirSnapshot{j}={}; +end offset0 = fBlock-1; -% Only for testing! - -% fBlock -% nBlock -% -% -% nCPU -% totCPU -% nBlockPerCPU -% totSlaves - -% keyboard - % Clean up remnants of previous runs. mydelete(['comp_status_',fname,'*.mat']); mydelete(['P_',fname,'*End.txt']); +mydelete([fname,'_output_*.mat']); % Create a shell script containing the commands to launch the required @@ -193,6 +172,31 @@ else dynareParallelMkDir(PRCDir,Parallel(1:totSlaves)); end +% Testing Zone + +% 1. Display the User Strategy: + +% if Strategy==0 +% disp('User Strategy Now Is Open/Close (0)'); +% else +% disp('User Strategy Now Is Always Open (1)'); +% end + + +% 2. Display the output of 'NEW' distributeJobs.m: +% +% fBlock +% nBlock +% +% +% nCPU +% totCPU +% nBlockPerCPU +% totSlaves +% +% keyboard + +% End for j=1:totCPU, @@ -279,113 +283,136 @@ for j=1:totCPU, end + % DA SINTETIZZARE: + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % The following 'switch - case' code is the core of this function! switch Strategy - case 0 - - if Parallel(indPC).Local == 1, % 0.1 Run on the local machine (localhost). - - if ~ispc, %isunix || (~matlab_ver_less_than('7.4') && ismac), - if exist('OCTAVE_VERSION') - command1=['octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')" &']; - else - command1=[Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')" &']; - end - else - if (exist('OCTAVE_VERSION') || (findstr(Parallel(indPC).MatlabOctavePath, 'octave'))) % exist('OCTAVE_VERSION') - command1=['start /B psexec -W ',DyMo, ' -a ',int2str(Parallel(indPC).CPUnbr(j-nCPU0)),' -low octave --eval "default_save_options(''-v7''); addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); 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).CPUnbr(j-nCPU0)),' -low ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; - end - end - else % 0.2 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 ~ispc, %isunix || (~matlab_ver_less_than('7.4') && ismac), - if exist('OCTAVE_VERSION'), - command1=['ssh ',Parallel(indPC).UserName,'@',Parallel(indPC).ComputerName,' "cd ',Parallel(indPC).RemoteDirectory,'/',PRCDir, '; octave --eval \"addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''');\" " &']; - else - command1=['ssh ',Parallel(indPC).UserName,'@',Parallel(indPC).ComputerName,' "cd ',Parallel(indPC).RemoteDirectory,'/',PRCDir, '; ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r \"addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''');\" " &']; - end - else - if ~strcmp(Parallel(indPC).ComputerName,MasterName), % 0.3 Run on a remote machine! - if (exist('OCTAVE_VERSION') || (findstr(Parallel(indPC).MatlabOctavePath, 'octave'))) % exist('OCTAVE_VERSION'), - command1=['start /B psexec \\',Parallel(indPC).ComputerName,' -e -u ',Parallel(indPC).UserName,' -p ',Parallel(indPC).Password,' -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\ -a ',int2str(Parallel(indPC).CPUnbr(j-nCPU0)), ... - ' -low octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; + case 0 + + if Parallel(indPC).Local == 1, % 0.1 Run on the local machine (localhost). + + if ~ispc || strcmpi('unix',Parallel(indPC).OperatingSystem), % Hybrid computing Matlab(Master)->Octave(Slaves) and Vice Versa! + if strfind([Parallel(indPC).MatlabOctavePath], 'octave') + command1=['octave --eval "default_save_options(''-v7''); addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')" &']; else - command1=['start /B psexec \\',Parallel(indPC).ComputerName,' -e -u ',Parallel(indPC).UserName,' -p ',Parallel(indPC).Password,' -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\ -a ',int2str(Parallel(indPC).CPUnbr(j-nCPU0)), ... - ' -low ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; + command1=[Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')" &']; end - else % 0.4 Run on the local machine via the network - if exist('OCTAVE_VERSION'), - command1=['start /B psexec \\',Parallel(indPC).ComputerName,' -e -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\ -a ',int2str(Parallel(indPC).CPUnbr(j-nCPU0)), ... - ' -low octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; + else % Hybrid computing Matlab(Master)->Octave(Slaves) and Vice Versa! + if strfind([Parallel(indPC).MatlabOctavePath], 'octave') + command1=['start /B psexec -W ',DyMo, ' -a ',int2str(Parallel(indPC).CPUnbr(j-nCPU0)),' -low octave --eval "default_save_options(''-v7''); addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; else - command1=['start /B psexec \\',Parallel(indPC).ComputerName,' -e -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\ -a ',int2str(Parallel(indPC).CPUnbr(j-nCPU0)), ... - ' -low ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; + command1=['start /B psexec -W ',DyMo, ' -a ',int2str(Parallel(indPC).CPUnbr(j-nCPU0)),' -low ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; end end - end - end - - - case 1 - if Parallel(indPC).Local == 1 && newInstance, % 1.1 Run on the local machine. - if ~ispc, %isunix || (~matlab_ver_less_than('7.4') && ismac), - if exist('OCTAVE_VERSION') - command1=['octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')" &']; - else - command1=[Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')" &']; + else % 0.2 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 - else - if exist('OCTAVE_VERSION') - command1=['start /B psexec -W ',DyMo, ' -a ',int2str(Parallel(indPC).CPUnbr(j-nCPU0)),' -low octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')"']; - else - command1=['start /B psexec -W ',DyMo, ' -a ',int2str(Parallel(indPC).CPUnbr(j-nCPU0)),' -low ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')"']; - end - end - elseif Parallel(indPC).Local==0, % 1.2 Run using network on remote machine or also on local machine. - if j==nCPU0+1, - dynareParallelSendFiles(NamFileInput,PRCDir,Parallel(indPC)); - end - dynareParallelSendFiles(['P_',fname,'_',int2str(j),'End.txt'],PRCDir,Parallel(indPC)); - delete(['P_',fname,'_',int2str(j),'End.txt']); - dynareParallelSendFiles(['slaveJob',int2str(j),'.mat'],PRCDir,Parallel(indPC)); - delete(['slaveJob',int2str(j),'.mat']); - if newInstance, - dynareParallelSendFiles(['slaveParallel_input',int2str(j),'.mat'],PRCDir,Parallel(indPC)) - if ~ispc, %isunix || (~matlab_ver_less_than('7.4') && ismac), - if exist('OCTAVE_VERSION'), - command1=['ssh ',Parallel(indPC).UserName,'@',Parallel(indPC).ComputerName,' "cd ',Parallel(indPC).RemoteDirectory,'/',PRCDir '; octave --eval \"addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),');\" " &']; + + if ~ispc || strcmpi('unix',Parallel(indPC).OperatingSystem), % Hybrid computing Matlab(Master)->Octave(Slaves) and Vice Versa! + if ispc, token='start /B '; + else token = ''; + end + if strfind([Parallel(indPC).MatlabOctavePath], 'octave'), + command1=[token, 'ssh ',Parallel(indPC).UserName,'@',Parallel(indPC).ComputerName,' "cd ',Parallel(indPC).RemoteDirectory,'/',PRCDir, '; octave --eval \"default_save_options(''-v7''); addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''');\" " &']; else - command1=['ssh ',Parallel(indPC).UserName,'@',Parallel(indPC).ComputerName,' "cd ',Parallel(indPC).RemoteDirectory,'/',PRCDir '; ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r \"addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),');\" " &']; + command1=[token, 'ssh ',Parallel(indPC).UserName,'@',Parallel(indPC).ComputerName,' "cd ',Parallel(indPC).RemoteDirectory,'/',PRCDir, '; ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r \"addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''');\" " &']; end else - if ~strcmp(Parallel(indPC).ComputerName,MasterName), % 1.3 Run on a remote machine. - if exist('OCTAVE_VERSION'), + if ~strcmp(Parallel(indPC).ComputerName,MasterName), % 0.3 Run on a remote machine! + % Hybrid computing Matlab(Master)-> Octave(Slaves) and Vice Versa! + if strfind([Parallel(indPC).MatlabOctavePath], 'octave') command1=['start /B psexec \\',Parallel(indPC).ComputerName,' -e -u ',Parallel(indPC).UserName,' -p ',Parallel(indPC).Password,' -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\ -a ',int2str(Parallel(indPC).CPUnbr(j-nCPU0)), ... - ' -low octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')"']; + ' -low octave --eval "default_save_options(''-v7''); addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; else command1=['start /B psexec \\',Parallel(indPC).ComputerName,' -e -u ',Parallel(indPC).UserName,' -p ',Parallel(indPC).Password,' -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\ -a ',int2str(Parallel(indPC).CPUnbr(j-nCPU0)), ... - ' -low ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')"']; + ' -low ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; end - else % 1.4 Run on the local machine via the network. - if exist('OCTAVE_VERSION'), + else % 0.4 Run on the local machine via the network + % Hybrid computing Matlab(Master)->Octave(Slaves) and Vice Versa! + if strfind([Parallel(indPC).MatlabOctavePath], 'octave') command1=['start /B psexec \\',Parallel(indPC).ComputerName,' -e -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\ -a ',int2str(Parallel(indPC).CPUnbr(j-nCPU0)), ... - ' -low octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')"']; + ' -low octave --eval "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; else command1=['start /B psexec \\',Parallel(indPC).ComputerName,' -e -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\ -a ',int2str(Parallel(indPC).CPUnbr(j-nCPU0)), ... - ' -low ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')"']; + ' -low ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); fParallel(',int2str(offset+1),',',int2str(sum(nBlockPerCPU(1:j))),',',int2str(j),',',int2str(indPC),',''',fname,''')"']; end end end end - end - + + + case 1 + if Parallel(indPC).Local == 1 && newInstance, % 1.1 Run on the local machine. + if ~ispc || strcmpi('unix',Parallel(indPC).OperatingSystem), + % Hybrid computing Matlab(Master)-> Octave(Slaves) and Vice Versa! + if strfind([Parallel(indPC).MatlabOctavePath], 'octave') + command1=['octave --eval "default_save_options(''-v7''); addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')" &']; + else + command1=[Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')" &']; + end + else % Hybrid computing Matlab(Master)->Octave(Slaves) and Vice Versa! + if strfind([Parallel(indPC).MatlabOctavePath], 'octave') + command1=['start /B psexec -W ',DyMo, ' -a ',int2str(Parallel(indPC).CPUnbr(j-nCPU0)),' -low octave --eval "default_save_options(''-v7'');addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')"']; + else + command1=['start /B psexec -W ',DyMo, ' -a ',int2str(Parallel(indPC).CPUnbr(j-nCPU0)),' -low ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')"']; + end + end + elseif Parallel(indPC).Local==0, % 1.2 Run using network on remote machine or also on local machine. + if j==nCPU0+1, + dynareParallelSendFiles(NamFileInput,PRCDir,Parallel(indPC)); + end + dynareParallelSendFiles(['P_',fname,'_',int2str(j),'End.txt'],PRCDir,Parallel(indPC)); + delete(['P_',fname,'_',int2str(j),'End.txt']); + if newInstance, + dynareParallelSendFiles(['slaveJob',int2str(j),'.mat'],PRCDir,Parallel(indPC)); + delete(['slaveJob',int2str(j),'.mat']); + dynareParallelSendFiles(['slaveParallel_input',int2str(j),'.mat'],PRCDir,Parallel(indPC)) + if ~ispc || strcmpi('unix',Parallel(indPC).OperatingSystem), + if ispc, token='start /B '; + else token = ''; + end + % Hybrid computing Matlab(Master)-> Octave(Slaves) and Vice Versa! + if strfind([Parallel(indPC).MatlabOctavePath], 'octave') + command1=[token, 'ssh ',Parallel(indPC).UserName,'@',Parallel(indPC).ComputerName,' "cd ',Parallel(indPC).RemoteDirectory,'/',PRCDir '; octave --eval \"default_save_options(''-v7''); addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),');\" " &']; + else + command1=[token, 'ssh ',Parallel(indPC).UserName,'@',Parallel(indPC).ComputerName,' "cd ',Parallel(indPC).RemoteDirectory,'/',PRCDir '; ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r \"addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),');\" " &']; + end + else + if ~strcmp(Parallel(indPC).ComputerName,MasterName), % 1.3 Run on a remote machine. + % Hybrid computing Matlab(Master)->Octave(Slaves) and Vice Versa! + if strfind([Parallel(indPC).MatlabOctavePath], 'octave') + command1=['start /B psexec \\',Parallel(indPC).ComputerName,' -e -u ',Parallel(indPC).UserName,' -p ',Parallel(indPC).Password,' -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\ -a ',int2str(Parallel(indPC).CPUnbr(j-nCPU0)), ... + ' -low octave --eval "default_save_options(''-v7'');addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')"']; + else + command1=['start /B psexec \\',Parallel(indPC).ComputerName,' -e -u ',Parallel(indPC).UserName,' -p ',Parallel(indPC).Password,' -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\ -a ',int2str(Parallel(indPC).CPUnbr(j-nCPU0)), ... + ' -low ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')"']; + end + else % 1.4 Run on the local machine via the network. + % Hybrid computing Matlab(Master)->Octave(Slaves) and Vice Versa! + if strfind([Parallel(indPC).MatlabOctavePath], 'octave') + command1=['start /B psexec \\',Parallel(indPC).ComputerName,' -e -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\ -a ',int2str(Parallel(indPC).CPUnbr(j-nCPU0)), ... + ' -low octave --eval "default_save_options(''-v7''); addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')"']; + else + command1=['start /B psexec \\',Parallel(indPC).ComputerName,' -e -W ',Parallel(indPC).RemoteDrive,':\',Parallel(indPC).RemoteDirectory,'\',PRCDir,'\ -a ',int2str(Parallel(indPC).CPUnbr(j-nCPU0)), ... + ' -low ',Parallel(indPC).MatlabOctavePath,' -nosplash -nodesktop -minimize ',compThread,' -r "addpath(''',Parallel(indPC).DynarePath,'''), dynareroot = dynare_config(); slaveParallel(',int2str(j),',',int2str(indPC),')"']; + end + end + end + else + if isempty(PRCDirSnapshot{indPC}), + PRCDirSnapshot(indPC)=dynareParallelSnapshot(PRCDir,Parallel(indPC)); + else + PRCDirSnapshot(indPC)=dynareParallelGetNewFiles(PRCDir,Parallel(indPC),PRCDirSnapshot(indPC)); + end + dynareParallelSendFiles(['slaveJob',int2str(j),'.mat'],PRCDir,Parallel(indPC)); + delete(['slaveJob',int2str(j),'.mat']); + + end + end + end fprintf(fid,'%s\n',command1); @@ -406,29 +433,22 @@ end % the slaves ... % If the compuation is 'Local' it is not necessary to do it ... -% PRCDirSnapshot={}; -% -% for indPC=1:totSlaves -% -% if Parallel(indPC).Local==0; -% PRCDirSnapshot{indPC}=dynareParallelListAllFiles(['\\',Parallel(indPC).ComputerName,'\',Parallel(indPC).RemoteDrive,'$\',Parallel(indPC).RemoteDirectory,'\',PRCDir]); -% end -% -% end - +if Strategy==0 || newInstance, + PRCDirSnapshot=dynareParallelSnapshot(PRCDir,Parallel(1:totSlaves)); -% Run the slaves. -if ~ispc, %isunix || (~matlab_ver_less_than('7.4') && ismac), - system('sh ConcurrentCommand1.bat &'); - pause(1) -else - - if exist('OCTAVE_VERSION') - % Redirect the standard output to the file 'OctaveStandardOutputMessage.txt'! - % This file is saved in the Model directory. - system('ConcurrentCommand1.bat > OctaveStandardOutputMessage.txt'); + % Run the slaves. + if ~ispc, %isunix || (~matlab_ver_less_than('7.4') && ismac), + system('sh ConcurrentCommand1.bat &'); + pause(1) else - system('ConcurrentCommand1.bat'); + + if exist('OCTAVE_VERSION') + % Redirect the standard output to the file 'OctaveStandardOutputMessage.txt'! + % This file is saved in the Model directory. + system('ConcurrentCommand1.bat > OctaveStandardOutputMessage.txt'); + else + system('ConcurrentCommand1.bat'); + end end end @@ -450,19 +470,19 @@ if exist('OCTAVE_VERSION') || (options_.console_mode == 1), end else hfigstatus = figure('name',['Parallel ',fname],... - 'DockControls','off', ... - 'IntegerHandle','off', ... - 'Interruptible','off', ... - 'MenuBar', 'none', ... - 'NumberTitle','off', ... - 'Renderer','Painters', ... - 'Resize','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]); + 'box','on','xtick',[],'ytick',[],'xlim',[0 1],'ylim',[0 1]); set(hstatus(1),'Units','pixels') hpixel = get(hstatus(1),'Position'); hfigure = get(hfigstatus,'Position'); @@ -475,7 +495,7 @@ else jrow = mod(j-1,10)+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]); + '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 ...']); @@ -495,6 +515,14 @@ delete(['comp_status_',fname,'*.mat']); % Caption for console mode computing ... if (options_.console_mode == 1) || exist('OCTAVE_VERSION') + + if ~exist('OCTAVE_VERSION') + if strcmp([Parallel(indPC).MatlabOctavePath], 'octave') + RjInformation='Hybrid Computing Is Active: Remote jobs are computed by Octave!'; + fprintf([RjInformation,'\n\n']); + end + end + fnameTemp=fname; L=length(fnameTemp); @@ -519,7 +547,7 @@ if (options_.console_mode == 1) || exist('OCTAVE_VERSION') Information=['Parallel ' fnameTemp ' Computing ...']; if exist('OCTAVE_VERSION') - if (~ispc) && (Strategy==0) + if (~ispc || strcmpi('unix',Parallel(indPC).OperatingSystem)) && (Strategy==0) printf('\n'); pause(2); end @@ -532,7 +560,14 @@ if (options_.console_mode == 1) || exist('OCTAVE_VERSION') end - +% Testing Zone + +% Check the new copy file strategy ... +global NuoviFilecopiati +NuoviFilecopiati=zeros(1,totSlaves); +% End + + ForEver=1; statusString = ''; @@ -559,7 +594,7 @@ while (ForEver) pcerdone(j) = prtfrc; idCPU(j) = njob; if exist('OCTAVE_VERSION') || (options_.console_mode == 1), - if (~ispc) + if (~ispc || strcmpi('unix',Parallel(indPC).OperatingSystem)) statusString = [statusString, int2str(j), ' %3.f%% done! ']; else statusString = [statusString, int2str(j), ' %3.f%% done! ']; @@ -569,9 +604,9 @@ while (ForEver) status_Title{j} = waitbarTitle; end catch % ME - % To define! + % To define! if exist('OCTAVE_VERSION') || (options_.console_mode == 1), - if (~ispc) + if (~ispc || strcmpi('unix',Parallel(indPC).OperatingSystem)) statusString = [statusString, int2str(j), ' %3.f%% done! ']; else statusString = [statusString, int2str(j), ' %3.f%% done! ']; @@ -598,30 +633,19 @@ while (ForEver) end end end - -% Check if any slave has generated some new files remotely. - -% for i ... -% NewFiles=dynareParallelFindNewFiles(...,...) -% if ~isempty(NewFiles) -% if Parallel(indPC).Local==0; -% Se decidiamo di farlo qui e non in dynareParallelFindNewFiles, -% Confronta NewFiles e PRCDirSnapshot{i} per trovare i nuovi files ... -% Copia i nuovi files qui ... -% Metti PRCDirSnapshot{i}=NewFiles -% NewFiles=[]; -% else -% continue -% end -% end -% end - + % Check if the slave(s) has generated some new files remotely. + % 1. The files .log and .txt are not copied. + % 2. The comp_status_*.mat files are managed separately. + PRCDirSnapshot=dynareParallelGetNewFiles(PRCDir,Parallel(1:totSlaves),PRCDirSnapshot); + 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))) + + % Checking if the remote computation is finished and if we copied all the output here. + if ~isempty(dir([fname,'_output_',int2str(j),'.mat'])) HoTuttiGliOutput=HoTuttiGliOutput+1; end end @@ -649,15 +673,19 @@ while (ForEver) end -% Create return value. + +% Load and format remote output. iscrash = 0; + for j=1:totCPU, indPC=min(find(nCPU>=j)); - dynareParallelGetFiles([fname,'_output_',int2str(j),'.mat'],PRCDir,Parallel(indPC)); + % Already done above. + % dynareParallelGetFiles([fname,'_output_',int2str(j),'.mat'],PRCDir,Parallel(indPC)); load([fname,'_output_',int2str(j),'.mat'],'fOutputVar'); delete([fname,'_output_',int2str(j),'.mat']); if isfield(fOutputVar,'OutputFileName'), - dynareParallelGetFiles([fOutputVar.OutputFileName],PRCDir,Parallel(indPC)); + % Already done above + % dynareParallelGetFiles([fOutputVar.OutputFileName],PRCDir,Parallel(indPC)); end if isfield(fOutputVar,'error'), disp(['Job number ',int2str(j),' crashed with error:']); @@ -670,6 +698,8 @@ for j=1:totCPU, fOutVar(j)=fOutputVar; end end + + if iscrash, error('Remote jobs crashed'); end @@ -680,40 +710,40 @@ pause(1), % Wait for all remote diary off completed dynareParallelGetFiles('*.log',PRCDir,Parallel(1:totSlaves)); switch Strategy - case 0 - for indPC=1:length(Parallel) - if Parallel(indPC).Local == 0 - dynareParallelRmDir(PRCDir,Parallel(indPC)); + 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']); + + mydelete(['*_core*_input*.mat']); + % if Parallel(indPC).Local == 1 + % delete(['slaveParallel_input*.mat']); + % end + end - - if isempty(dir('dynareParallelLogFiles')) - [A B C]=rmdir('dynareParallelLogFiles'); - mkdir('dynareParallelLogFiles'); + + 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'); - delete([fname,'*.log']); - - mydelete(['*_core*_input*.mat']); - % if Parallel(indPC).Local == 1 - % delete(['slaveParallel_input*.mat']); - % end - - end - - delete ConcurrentCommand1.bat - case 1 - delete(['temp_input.mat']) - if newInstance, - if isempty(dir('dynareParallelLogFiles')) - [A B C]=rmdir('dynareParallelLogFiles'); - mkdir('dynareParallelLogFiles'); + if newInstance, + delete ConcurrentCommand1.bat end - end - copyfile('*.log','dynareParallelLogFiles'); - if newInstance, - delete ConcurrentCommand1.bat - end end