#! /usr/bin/perl -w
use strict;
use threads;
use MLDBM::Sync;
use MLDBM qw(DB_File Storable);
use Fcntl;
use Benchmark;
require '/home/silly/g/prep/Prep.pl';
my $file = "/home/silly/g/data/117373HOHsynTriNormCV.db";
my %syntrihash;
tie %syntrihash,'MLDBM::Sync',$file, O_RDONLY or die "tie failed for db $!\n";
my $NumbOfKeys = keys %syntrihash;
print "Number of Dots to compute: $NumbOfKeys\n";
my $t0 = new Benchmark;
foreach my $synset (keys %syntrihash){
my $hashref = \%{$syntrihash{$synset}};
#for testing i just dot the hash with itself
&hashValueDot($hashref,$hashref,my $dot);
}
untie %syntrihash;
my $t1 = new Benchmark;
my $td1 = timediff($t1, $t0);
print STDERR "the code took:",timestr($td1,'all')," to do dots\n";
####
silly@bluetit:~/perl/threads$ nothread.pl
Number of Dots to compute: 117369
the code took:94 wallclock secs (80.81 usr 13.03 sys + 0.00 cusr 0.00 csys = 93.84 CPU) to do dots
####
silly@bluetit:~/perl/threads$ cat thread.pl
#! /usr/bin/perl -w
use strict;
use threads;
use MLDBM::Sync;
use MLDBM qw(DB_File Storable);
use Fcntl;
use Benchmark;
my $t0 = new Benchmark;
require '/home/silly/g/prep/Prep.pl';
my $file = "/home/silly/g/data/117373HOHsynTriNormCV.db";
my %syntrihash;
tie %syntrihash,'MLDBM::Sync',$file, O_RDONLY or die "tie failed for db $!\n";
my $NumbOfKeys = keys %syntrihash;
print "Number of Dots to compute: $NumbOfKeys\n";
my $EndSection1 = int($NumbOfKeys/4);
my $EndSection2 = $EndSection1 + int($NumbOfKeys/4);
my $EndSection3 = $EndSection2 + int($NumbOfKeys/4);
my @synsetPart1;
my @synsetPart2;
my @synsetPart3;
my @synsetPart4;
my $k = 0;
foreach my $ss (keys %syntrihash){
if($k < $EndSection1){ $synsetPart1[$k] = $ss; }
elsif ($k < $EndSection2){ $synsetPart2[$k - $EndSection1] = $ss; }
elsif ($k < $EndSection3){ $synsetPart3[$k - $EndSection2] = $ss; }
else { $synsetPart4[$k - $EndSection3] = $ss; }
$k += 1;
}
untie %syntrihash;
my $t1 = new Benchmark;
my $td1 = timediff($t1, $t0);
print STDERR "the code took:",timestr($td1,'all')," to prep\n";
$t0 = new Benchmark;
my $thr1 = threads->create({'context' => 'array'}, \&subthr1, "test1");
my $thr2 = threads->create({'context' => 'array'}, \&subthr2, "test2");
my $thr3 = threads->create({'context' => 'array'}, \&subthr3, "test3");
my $thr4 = threads->create({'context' => 'array'}, \&subthr4, "test4");
my %return1 = $thr1 -> join();
my %return2 = $thr2 -> join();
my %return3 = $thr3 -> join();
my %return4 = $thr4 -> join();
my %synsetDotHash;
$t1 = new Benchmark;
$td1 = timediff($t1, $t0);
print STDERR "the code took:",timestr($td1,'all')," to do threaded dots\n";
sub subthr1{
tie %syntrihash,'MLDBM::Sync',$file, O_RDONLY or die "tie failed for db $!\n";
foreach my $synset (@synsetPart1){
my $hashref = \%{$syntrihash{$synset}};
&hashValueDot($hashref,$hashref,my $dot);
$synsetDotHash{$synset} = $dot;
}
my ($message) = @_;
print "Thread Message is $message\n";
return (%synsetDotHash);
}
sub subthr2{
tie %syntrihash,'MLDBM::Sync',$file, O_RDONLY or die "tie failed for db $!\n";
foreach my $synset (@synsetPart2){
my $hashref = \%{$syntrihash{$synset}};
&hashValueDot($hashref,$hashref,my $dot);
$synsetDotHash{$synset} = $dot;
}
my ($message) = @_;
print "Thread Message is $message\n";
return (%synsetDotHash);
}
sub subthr3{
tie %syntrihash,'MLDBM::Sync',$file, O_RDONLY or die "tie failed for db $!\n";
foreach my $synset (@synsetPart3){
my $hashref = \%{$syntrihash{$synset}};
&hashValueDot($hashref,$hashref,my $dot);
$synsetDotHash{$synset} = $dot;
}
my ($message) = @_;
print "Thread Message is $message\n";
return (%synsetDotHash);
}
sub subthr4{
tie %syntrihash,'MLDBM::Sync',$file, O_RDONLY or die "tie failed for db $!\n";
foreach my $synset (@synsetPart4){
my $hashref = \%{$syntrihash{$synset}};
&hashValueDot($hashref,$hashref,my $dot);
$synsetDotHash{$synset} = $dot;
}
my ($message) = @_;
print "Thread Message is $message\n";
return (%synsetDotHash);
}
####
silly@bluetit:~/perl/threads$ thread.pl
Number of Dots to compute: 117369
the code took: 2 wallclock secs ( 1.92 usr 0.67 sys + 0.00 cusr 0.00 csys = 2.59 CPU) to prep
Thread Message is test2
Thread Message is test3
Thread Message is test1
Thread Message is test4
the code took:23 wallclock secs (70.72 usr 12.29 sys + 0.00 cusr 0.00 csys = 83.01 CPU) to do threaded dots