MCE(3pm) | User Contributed Perl Documentation | MCE(3pm) |
MCE - Many-Core Engine for Perl providing parallel processing capabilities
This document describes MCE version 1.838
Many-Core Engine (MCE) for Perl helps enable a new level of performance by maximizing all available cores.
MCE spawns a pool of workers and therefore does not fork a new process per each element of data. Instead, MCE follows a bank queuing model. Imagine the line being the data and bank-tellers the parallel workers. MCE enhances that model by adding the ability to chunk the next n elements from the input stream to the next available worker.
This is a simplistic use case of MCE running with 5 workers.
# Construction using the Core API use MCE; my $mce = MCE->new( max_workers => 5, user_func => sub { my ($mce) = @_; $mce->say("Hello from " . $mce->wid); } ); $mce->run; # Construction using a MCE model use MCE::Flow max_workers => 5; mce_flow sub { my ($mce) = @_; MCE->say("Hello from " . MCE->wid); };
The following is a demonstration for parsing a huge log file in parallel.
use MCE::Loop; MCE::Loop::init { max_workers => 8, use_slurpio => 1 }; my $pattern = 'something'; my $hugefile = 'very_huge.file'; my @result = mce_loop_f { my ($mce, $slurp_ref, $chunk_id) = @_; # Quickly determine if a match is found. # Process the slurped chunk only if true. if ($$slurp_ref =~ /$pattern/m) { my @matches; # The following is fast on Unix, but performance degrades # drastically on Windows beyond 4 workers. open my $MEM_FH, '<', $slurp_ref; binmode $MEM_FH, ':raw'; while (<$MEM_FH>) { push @matches, $_ if (/$pattern/); } close $MEM_FH; # Therefore, use the following construction on Windows. while ( $$slurp_ref =~ /([^\n]+\n)/mg ) { my $line = $1; # save $1 to not lose the value push @matches, $line if ($line =~ /$pattern/); } # Gather matched lines. MCE->gather(@matches); } } $hugefile; print join('', @result);
The next demonstration loops through a sequence of numbers with MCE::Flow.
use MCE::Flow; my $N = shift || 4_000_000; sub compute_pi { my ( $beg_seq, $end_seq ) = @_; my ( $pi, $t ) = ( 0.0 ); foreach my $i ( $beg_seq .. $end_seq ) { $t = ( $i + 0.5 ) / $N; $pi += 4.0 / ( 1.0 + $t * $t ); } MCE->gather( $pi ); } # Compute bounds only, workers receive [ begin, end ] values MCE::Flow::init( chunk_size => 200_000, max_workers => 8, bounds_only => 1 ); my @ret = mce_flow_s sub { compute_pi( $_->[0], $_->[1] ); }, 0, $N - 1; my $pi = 0.0; $pi += $_ for @ret; printf "pi = %0.13f\n", $pi / $N; # 3.1415926535898
Three modules make up the core engine for MCE.
There are 4 add-on modules for use with MCE.
The models take Many-Core Engine to a new level for ease of use. Two options (chunk_size and max_workers) are configured automatically as well as spawning and shutdown.
Miscellaneous additions included with the distribution.
Perl 5.8.0 or later. PDL::IO::Storable is required in scripts running PDL.
The source, cookbook, and examples are hosted at GitHub.
"MCE::Shared" provides data sharing capabilities for "MCE". It includes "MCE::Hobo" for running code asynchronously.
Mario E. Roy, <marioeroy AT gmail DOT com>
Copyright (C) 2012-2019 by Mario E. Roy
MCE is released under the same license as Perl.
See <http://dev.perl.org/licenses/> for more information.
2019-01-30 | perl v5.28.1 |