#!/usr/bin/perl
use warnings;
use strict;
use IO::Select;
use GRID::Machine;
use Time::HiRes qw(time gettimeofday tv_interval);
#my @machine = qw{europa};
#my @machine = qw{europa beowulf orion};
my @machine = qw{nereida europa};
#my @machine = qw{127.0.0.1 127.0.0.2 127.0.0.3 127.0.0.4};
#my @machine = qw{beo chum};
my $nummachines = @machine;
my %machine; # Hash of GRID::Machine objects
#my %debug = (beowulf => 12345, orion => 0, nereida => 0);
#my %debug = (europa => 12344, beowulf => 0, orion => 0, nereida => 0);
my %debug = (europa => 0, beowulf => 0, orion => 0, nereida => 0);
my $np = shift || $nummachines; # number of processes
my $lp = $np-1;
my $N = shift || 100;
my @pid; # List of process pids
my @proc; # List of handles
my %id; # Gives the ID for a given handle
my $cleanup = 0;
my $pi = 0;
my $readset = IO::Select->new();
my $i = 0;
for (@machine){
my $m = GRID::Machine->new(host => $_, debug => $debug{$_}, );
$m->copyandmake(
dir => 'pi',
makeargs => 'pi',
files => [ qw{pi.c Makefile} ],
cleanfiles => $cleanup,
cleandirs => $cleanup, # remove the whole directory at the end
keepdir => 1,
);
$m->chdir("pi/");
die "Can't execute 'pi'\n" unless $m->_x("pi")->result;
$machine{$_} = $m;
last unless ++$i < $np;
}
my $t0 = [gettimeofday];
for (0..$lp) {
my $hn = $machine[$_ % $nummachines];
my $m = $machine{$hn};
($proc[$_], $pid[$_]) = $m->open("./pi $_ $N $np |");
$readset->add($proc[$_]);
my $address = 0+$proc[$_];
$id{$address} = $_;
}
my @ready;
my $count = 0;
do {
push @ready, $readset->can_read unless @ready;
my $handle = shift @ready;
my $me = $id{0+$handle};
my ($partial);
my $numBytesRead = sysread($handle, $partial, 1024);
chomp($partial);
$pi += $partial;
print "Process $me: machine = $machine[$me % $nummachines] partial = $partial pi = $pi\n";
$readset->remove($handle) if eof($handle);
} until (++$count == $np);
my $elapsed = tv_interval ($t0);
print "Pi = $pi. N = $N Time = $elapsed\n";
__END__
pp2@nereida:~/LGRID_Machine/examples$ time ssh beowulf 'pi/pi 0 1000000000 1'
3.141593
real 0m27.020s
user 0m0.036s
sys 0m0.008s
casiano@beowulf:~$ time ssh orion 'pi/pi 0 1000000000 1'
3.141593
real 0m29.120s
user 0m0.028s
sys 0m0.003s
pp2@nereida:~/LGRID_Machine/examples$ time ssh nereida 'pi/pi 0 1000000000 1'
3.141593
real 0m32.534s
user 0m0.036s
sys 0m0.008s
pp2@nereida:~/LGRID_Machine/examples$ time gridpipes.pl 1 1000000000
Process 0: machine = beowulf partial = 3.141593 pi = 3.141593
Pi = 3.141593. N = 1000000000 Time = 27.058693
real 0m28.917s
user 0m0.584s
sys 0m0.192s
pp2@nereida:~/LGRID_Machine/examples$ time gridpipes.pl 2 1000000000
Process 0: machine = beowulf partial = 1.570796 pi = 1.570796
Process 1: machine = orion partial = 1.570796 pi = 3.141592
Pi = 3.141592. N = 1000000000 Time = 15.094719
real 0m17.684s
user 0m0.904s
sys 0m0.260s
pp2@nereida:~/LGRID_Machine/examples$ time gridpipes.pl 3 1000000000
Process 0: machine = beowulf partial = 1.047198 pi = 1.047198
Process 1: machine = orion partial = 1.047198 pi = 2.094396
Process 2: machine = nereida partial = 1.047198 pi = 3.141594
Pi = 3.141594. N = 1000000000 Time = 10.971036
real 0m13.700s
user 0m0.952s
sys 0m0.240s
# 2 veces nereida
pp2@nereida:~/LGRID_Machine/examples$ time gridpipes.pl 2 1000000000
Process 0: machine = 127.0.0.1 partial = 1.570796 pi = 1.570796
Process 1: machine = 127.0.0.2 partial = 1.570796 pi = 3.141592
Pi = 3.141592. N = 1000000000 Time = 16.38121
real 0m17.849s
user 0m0.504s
sys 0m0.212s
******************************************
con -O 3 en gcc
pp2@nereida:~/LGRID_Machine/examples$ time gridpipes.pl 4 1000000000
Process 3: machine = 127.0.0.4 partial = 0.785398 pi = 0.785398
Process 0: machine = 127.0.0.1 partial = 0.785398 pi = 1.570796
Process 1: machine = 127.0.0.2 partial = 0.785398 pi = 2.356194
Process 2: machine = 127.0.0.3 partial = 0.785398 pi = 3.141592
Pi = 3.141592. N = 1000000000 Time = 18.508143
real 0m21.299s
user 0m0.840s
sys 0m0.360s
pp2@nereida:~/LGRID_Machine/examples$ time gridpipes.pl 2 1000000000
Process 1: machine = 127.0.0.2 partial = 1.570796 pi = 1.570796
Process 0: machine = 127.0.0.1 partial = 1.570796 pi = 3.141592
Pi = 3.141592. N = 1000000000 Time = 16.552487
real 0m18.076s
user 0m0.504s
sys 0m0.188s
pp2@nereida:~/LGRID_Machine/examples$ time gridpipes.pl 3 1000000000
Process 1: machine = 127.0.0.2 partial = 1.047198 pi = 1.047198
Process 0: machine = 127.0.0.1 partial = 1.047198 pi = 2.094396
Process 2: machine = 127.0.0.3 partial = 1.047198 pi = 3.141594
Pi = 3.141594. N = 1000000000 Time = 17.372372
real 0m19.461s
user 0m0.696s
sys 0m0.240s
pp2@nereida:~/LGRID_Machine/examples$ time gridpipes.pl 1 1000000000
Process 0: machine = 127.0.0.1 partial = 3.141593 pi = 3.141593
Pi = 3.141593. N = 1000000000 Time = 32.968117
real 0m33.858s
user 0m0.336s
sys 0m0.128s