On Thu, Feb 18, 2010 at 4:29 AM, Muthiah Annamalai <[email protected]> wrote:
> Date: Tue, 16 Feb 2010 09:47:57 +0100
> From: Luca Favatella <[email protected]>
> Subject:
>
> On 08/02/2010, Luca Favatella <[email protected]> wrote:
>> On 08/02/2010, Muthiah Annamalai <[email protected]> wrote:
> [...]
>> Great! Thanks for your interest and contribution.
>> I'd prefer to keep ga package Matlab compatible, so I locally started
>> to implement handling of "UseParallel" [0] and "Vectorized" [1]
>> options. Below you can read the description I'm adding for them. I
>> hope to commit this code by this week. Then we will be able to decide
>> if it is possible to add your ideas (or other ideas in this email
>> thread) in a Matlab-compatible way.
>
> | (Sorry for the delay.)
> |
> | Now modifying one line in __ga_scores__.m it is possible to integrate
> | parallel evaluation (I marked that line with TODO).
> | You can commit you changes yourself, or please provide me a patch.
> |
> | Cheers,
> | Luca Favatella
>
> Hello there,
>
> Thanks for modify the toolbox to allow for the vectorized solver support.
>
> I found it necessary to add option Ncore to the GA optimset default functions,
> as default_options.Ncores = 1; .
>
> The patch uses essentially the same mechanism of separate processess,
> ( despite the excellent suggestions to use MPI and parcellfun()  ) as I found
> them to have some advantages which only MPI could give for large data sets.
> Jaroslav & Riccardo Corradini for your suggestions.
>
> The patch touches the following files:
> 1. gaoptimset.m
> 2. __gaoptimset_default_options__.m
> 3. __ga_scores__.m
>
> and introduces two new files,
>
> 4. __ga_multicore_scores__.m
> 5. __ga_multicore_helper__.m
>
> I hope they are acceptable changes.
> Let me know what you think.
>
> Best,
> -Muthu
>

I am re-attaching the documents as plain-text since they didn't go
through first time. Sorry for inconvenience.
-Muthu

##----------------------File __ga_multicore_helper__.m
-----------------------------
## Copyright (C) 2010 Muthiah Annamalai <[email protected]>
##
## This program 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 2 of the License, or
## (at your option) any later version.
##
## This program 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 this program; If not, see <http://www.gnu.org/licenses/>.
##

## usage: octave -q __ga_multicore_helper__.m fitnessfcn matfile
## and save the result in proc-$matfile in the variable fitnessval.
## load(procfile); ## has variable fitnessval.
##
more off
parameters = argv();
## fprintf('__ga_multicore_helper__.m : Child process %d: command line
received :\n',getpid());
## parameters

fitnessfcn = parameters{1}; matfile = parameters{2};
load(matfile);

fitnessval = feval( fitnessfcn, data(:) );
## fitnessval

save('-mat',sprintf('proc-%s',matfile),'fitnessval');
## -----------------------------------------File
__ga_multicore_scores__.m-------------------------
## Copyright (C) 2010 Muthiah Annamalai <[email protected]>
## Copyright (C) 2008 Luca Favatella <[email protected]>
##
## This program 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 2 of the License, or
## (at your option) any later version.
##
## This program 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 this program; If not, see <http://www.gnu.org/licenses/>.

## Author: Luca Favatella <[email protected]>
## Version: 5.3.1
##
## Modified for use with Multicore CPU to utilize data-parallel
## nature of GA fitness functions, which we cannot do with limited
## License software. Go Octave!
##
## Assumptions, Fitness functions have to be a m-file, since we
## donot share memory with the child process.
## [ncores] has to be the number of cores to be used in the GA
## fitness evaluation, obtained as struct element of GA problem,
## and passed down to us.
##

function Scores = __ga_multicore_scores__ (fitnessfcn, Population, ncores)
  if ( nargin < 2 )
       error('__ga_multicore_scores__ : internal function, wrong
invocation');
  elseif ( nargin < 3 )
       ncores = 2;
  end

  [nrPopulation ncPopulation] = size (Population);
  Scores = zeros(nrPopulation,1);

  probstr = 
sprintf('GA-%d-Pop-%dx%d-',round(rand()*1e6),nrPopulation,ncPopulation);
  datestr = strrep(ctime(time),':','-');
  matfileprefix = sprintf('%s-%s',probstr,datestr);
  matfileprefix = strrep(matfileprefix,' ','-');

  index = 1;
  while ( index  <= nrPopulation )
    matfilename = {};

    ## save ncore data elements to file
    idx = index;
    while ( idx <= nrPopulation && idx < index + ncores )
          matfile = sprintf('%s-%d.mat',matfileprefix(1:end-1),idx);
          matfilename{idx-index + 1} = matfile;
          data = Population(index, 1:ncPopulation);
          save('-mat',matfile,'data');
          idx = idx + 1;
    end
    nprocs = idx-index; ## number of processess to be started.

    ## start the processess with the marshaller function
    idx = index; pid_child = zeros( nprocs, 1 );
    while ( idx <= nrPopulation && idx < index + ncores )
          matfile = matfilename{idx-index + 1};
          pid_child( idx - index + 1 ) = system(sprintf('octave -q
__ga_multicore_helper__.m "%s" "%s" ',fitnessfcn,
matfile),'','async');
          idx = idx + 1;
    end

    ## wait for the processess to finish
    for idx = 1:nprocs
        waitpid( pid_child(idx), 0 );
        ## fprintf('GA multicore: Terminated Child %d\n',pid_child(idx));
    end
    ## matfilename; nprocs

    ## load results from the processed cousins
    for idx = 1:nprocs
        matfile = matfilename{idx}
        procfile = sprintf('proc-%s',matfile);
        load(procfile); ## has variable fitnessval.
        Scores(index+idx-1,1) = fitnessval;
        unlink(matfile);
        unlink(procfile);
    end
    index = index + ncores;
  end

  Scores(1:nrPopulation, 1) = Scores;
endfunction
## ------------------------------------------------------------------
Patch file begins:

Index: __gaoptimset_default_options__.m
===================================================================
--- __gaoptimset_default_options__.m    (revision 6922)
+++ __gaoptimset_default_options__.m    (working copy)
@@ -50,4 +50,6 @@
                                 #default_options.TolFun = 1e-6;
   default_options.UseParallel = "never";
   default_options.Vectorized = "off";
-endfunction
\ No newline at end of file
+  default_options.Ncores = 1;
+endfunction
+
Index: __ga_scores__.m
===================================================================
--- __ga_scores__.m     (revision 6922)
+++ __ga_scores__.m     (working copy)
@@ -22,7 +22,16 @@
       warning ("'Vectorized' option is 'on': ignoring 'UseParallel' \
           option, even if it is 'always'");
     endif
-    Scores = problem.fitnessfcn (Population);
+    ## use multicore score evaluator
+    ## fitnessfcn has to be a string or m-file name converted from a handle.
+    ## accessible from another process that does not share memory-space.
+    if ( strcmp(class(problem.fitnessfcn),"function_handle") )
+      fitness_fcn_name = func2str( problem.fitnessfcn );
+    else
+      fitness_fcn_name = problem.fitnessfcn;
+    end
+    Scores = 
__ga_multicore_score__(fitness_fcn_name,population,problem.options.ncores);
+    return
   else ## not using vectorized evaluation
     if (! strcmp (problem.options.Vectorized, "off"))
       error ("'Vectorized' option must be 'on' or 'off'");
@@ -42,4 +51,4 @@
       Scores = tmp(1:nrP, 1);
     endif
   endif
-endfunction
\ No newline at end of file
+endfunction
Index: gaoptimset.m
===================================================================
--- gaoptimset.m        (revision 6922)
+++ gaoptimset.m        (working copy)
@@ -54,6 +54,8 @@
 ##       "always" | "never" (default) . Parallel evaluation of
objective function. TODO: parallel evaluation of nonlinear constraints
 ## @item Vectorized
 ##       "on" | "off" (default) . Vectorized evaluation of objective
function. TODO: vectorized evaluation of nonlinear constraints
+## @item Ncores
+##        n | 1 ( default ) . Specify non-zero integer, the number of
cores to use for evaluating the Vectorized GA on multicore machines.
 ## @end table
 ##
 ## @seealso{ga}
@@ -92,4 +94,4 @@
 %! options = gaoptimset ("EliteCount", 1, "FitnessLimit", 1e-7,
"Generations", 1000, "PopInitRange", [-5; 5], "PopulationSize", 200);
 %!
 %! ## "CrossoverFraction" is not specified, so gaoptimset should put
the default value: testing this too
-%! assert ([(getfield (options, "CrossoverFraction")); (getfield
(options, "EliteCount")); (getfield (options, "FitnessLimit"));
(getfield (options, "Generations")); (getfield (options,
"PopInitRange")); (getfield (options, "PopulationSize"))], [0.8; 1;
1e-7; 1000; [-5; 5]; 200])
\ No newline at end of file
+%! assert ([(getfield (options, "CrossoverFraction")); (getfield
(options, "EliteCount")); (getfield (options, "FitnessLimit"));
(getfield (options, "Generations")); (getfield (options,
"PopInitRange")); (getfield (options, "PopulationSize"))], [0.8; 1;
1e-7; 1000; [-5; 5]; 200])

------------------------------------------------------------------------------
Download Intel&reg; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs 
proactively, and fine-tune applications for parallel performance. 
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
Octave-dev mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/octave-dev

Reply via email to