#!/opt/bin/perl
use strict;
use threads;
use threads::shared;
use Thread::Queue;
use Time::HiRes qw(time);
use Data::Dump qw[ pp ];
my $qv = new Thread::Queue;
my $qr = new Thread::Queue;
our $N ||= 50;
our $T ||= 4;
for (1..$T) {
async {
while (my $v = $qv->dequeue) {
my ($x, $y, $a, $b) = @$v;
my $r;
$a = [ @$a ];
$b = [ @$b ];
$r += $a->[ $_ ] * $b->[ $_ ] for 0 .. $#$a;
my $r = [ $x, $y, $r ];
share( $r );
$qr->enqueue( $r );
}
};
}
for (1..$T) {
async {
while () {
my @a = map [ map rand, 1 .. $N ], 1 .. $N;
my @b = map [ map rand, 1 .. $N ], 1 .. $N;
for my $x ( 0 .. $#a ) {
for my $y (0..$#b) {
my $a = []; share $a; push @$a, @{ $a[ $x ] };
my $b = []; share $b; push @$b, @{ $b[ $y ] };
my $v = []; share $v; push @$v, $x, $y, $a, $b;
}
}
}
};
}
my $t;
my $NN = $N * $N;
my $count;
while( my $r = $qr->dequeue ) {
++$count;
if ($count == 63) {
$t = time;
}
elsif (($count & 63) == 0) {
if (time > $t + 5) {
printf "%f\n", $count / ($N * $N * (time - $t));
last;
}
}
}
####
while() {
####
@a = [ [ 1, 2 ], [ 3, 4 ] ]
@b = [ [ 5, 6 ], [ 7, 8 ] ]
####
$Q =
[ 0, 0, [ 1, 2 ], [ 5, 6 ] ]
[ 0, 1, [ 1, 2 ], [ 7, 8 ] ]
[ 1, 0, [ 3, 4 ], [ 5, 6 ] ]
[ 1, 1, [ 3, 4 ], [ 7, 8 ] ]
####
elsif (($count & 63) == 0) {
####
if (time > $t + 5) {
####
printf "%f\n", $count / ($N * $N * (time - $t));
last;