#!/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;