I was worried whether I was making basic errors in testing the Perl version, so I decided to use the Benchmark module to get the numbers. I copied the matmult.pl file and added use Benchmark ':all' to the header of the file. The main() routine got changed to :
The user can specify how long each variant should be run, with a default of 5 seconds for each size if no arg is provided.
Adjusting for the number of multiplications involved in each size of matrix --- 8 for the 2x2 up to 1,000,000 for the 100x100 --- produces results very similar to what we've already seen ( millions of multiplications per second):
my $time = $ARGV[0] || 5;
my %vars = ( 2 => [],
5 => [],
10 => [],
32 => [],
100 => [],
);
for my $size ( keys %vars ) {
my $filestub = q{F_} . $size . q{x} . $size . q{.};
$vars{$size}[0] = readMatrix( $filestub . '1' );
$vars{$size}[1] = readMatrix( $filestub . '2' );
}
say "Processing for $time seconds each size ",
"will take @{[5 * $time]} seconds.";
say scalar localtime;
cmpthese( -$time, {
'F_2x2' => sub { matmult( $vars{2}[0],
$vars{2}[1]); },
'F_5x5' => sub { matmult( $vars{5}[0],
$vars{5}[1]); },
'F_10x10' => sub { matmult( $vars{10}[0],
$vars{10}[1]); },
'F_32x32' => sub { matmult( $vars{32}[0],
$vars{32}[1]); },
'F_100x100' => sub { matmult( $vars{100}[0],
$vars{100}[1]); },
});
say scalar localtime;
The user can specify how long each variant should be run, with a default of 5 seconds for each size if no arg is provided.
-➤ perl ./benchmark.pl 2
Processing for 2 seconds each size will take 10 seconds.
Mon Jun 15 17:11:08 2015
Rate F_100x100 F_32x32 F_10x10 F_5x5 F_2x2
F_100x100 5.39/s -- -97% -100% -100% -100%
F_32x32 163/s 2931% -- -97% -100% -100%
F_10x10 4909/s 90934% 2904% -- -85% -98%
F_5x5 32731/s 606904% 19929% 567% -- -88%
F_2x2 264660/s 4908131% 161856% 5292% 709% --
Mon Jun 15 17:11:22 2015
Adjusting for the number of multiplications involved in each size of matrix --- 8 for the 2x2 up to 1,000,000 for the 100x100 --- produces results very similar to what we've already seen ( millions of multiplications per second):
perl -E'say "100 => 5.36";
say "32 => ", 32000 * 154 / 10**6;
say "20 => ", 1000 * 4904 / 10**6;
say "5 => ", 125 * 32767 / 10**6;
say "2 => ", 8 * 263472 / 10**6;
'
100 => 5.39
32 => 5.216
20 => 4.909
5 => 4.091375
2 => 2.11728
Rerunning the benchmarks with integer matrices and use integer enabled generated insignificantly, fractionally better numbers; though I wonder if the pragma affected Benchmark's calculations.
Comments