ithreads:
$ perl -MConfig -e 'print "$Config{useithreads}\n"'
define
El área bajo la curva
$ cat -n pi.pl
1 #!/usr/bin/perl -w
2 # el número Pi es 3.
3 # 1415926535 8979323846 2643383279 5028841971 6939937510 5820974944 5923078164
4 # 0628620899 8628034825 3421170679 8214808651 3282306647 0938446095 5058223172
5 # 5359408128 4811174502 8410270193 8521105559 6446229489 5493038196 4428810975
6 # 6659334461 2847564823 3786783165 2712019091 4564856692 3460348610 4543266482
7 # 1339360726 0249141273 7245870066 0631558817 4881520920 9628292540 9171536436
8
9 use strict;
10 use threads;
11 use threads::shared;
12
13 our $N;
14 our $numthreads;
15 our $pi = 0;
16
17 sub chunk {
18 my $N = shift;
19 my $numthreads = shift;
20
21 my ($i, $x, $sum, $w);
22 my $id = threads->self()->tid();
23 $w = 1/$N;
24 $sum = 0;
25 for ($i = $id; $i < $N; $i += $numthreads) {
26 $x = ($i + 0.5)*$w;
27 $sum += 4.0/(1.0 + $x*$x);
28 }
29 print "thread $id: $sum\n";
30 return $sum;
31 }
32
33 sub par {
34 my $nt = shift();
35 my $task = shift;
36 my @t; # array of tasks
37 my $i;
38 my @results;
39
40 for($i=1; $i < $nt; $i++) {
41 $t[$i] = threads->new($task, @_);
42 }
43 @{$results[0]} = $task->( @_);
44 for($i=1; $i < $nt; $i++) {
45 @{$results[$i]} = $t[$i]->join();
46 }
47 @results;
48 }
49
50 ### main ###
51 $numthreads = (shift || 2);
52 $N = (shift || 10000);
53
54 my @results = par($numthreads, \&chunk, $N, $numthreads);
55 for (@results) { $pi += $_->[0] }
56 $pi /= $N;
57
58 print "PI = $pi\n";
59 for (@results) {
60 print @$_," ";
61 }
62 print "\n";
Ejecución:
$ time ./pi.pl 1 1000000 thread 0: 3141592.65358976 PI = 3.14159265358976 3141592.65358976 real 0m0.976s user 0m0.960s sys 0m0.010s $ time ./pi.pl 2 1000000 thread 1: 1570795.82679499 thread 0: 1570796.82679495 PI = 3.14159265358994 1570796.82679495 1570795.82679499 real 0m0.584s user 0m1.080s sys 0m0.000sLa máquina:
$ perl -ne 'print if m/processor|model_name|cache|MHz/' /proc/cpuinfo processor : 0 cpu MHz : 2657.850 cache size : 512 KB processor : 1 cpu MHz : 2657.850 cache size : 512 KB processor : 2 cpu MHz : 2657.850 cache size : 512 KB processor : 3 cpu MHz : 2657.850 cache size : 512 KBRealmente en la máquina usada sólo hay dos procesadores, cada uno de los cuales virtualiza dos procesadores.
parfor
que implante este tipo de asignación.
Vea también perldoc perlthrtut
o bien
http://search.cpan.org/~nwclark/perl-5.8.6/pod/perlthrtut.pod
Casiano Rodríguez León
