in reply to Multithreading, how to?

Take a look at CPAN module Parallel::Simple. This way you can simply pass prun a list of named arrayrefs with different arguments (data chunks as above) and let it do all the heavy lifting. You can even collect all the return values.

From the docs:

prun( foo => sub { print "$$ foo\n" }, bar1 => [ \&my_bar_func, @args ], bar2 => [ \&my_bar_func, @other_args ], ) or die( Parallel::Simple::errplus() );
If the machine you're running on is multicore this ought to leverage the extra iron, I'd use the '1' keystroke of the top command to see all cores and see if they're being utilized. This assumes a kind of parallelism where there are no dependencies between data chunks, like Fold@Home or SETI@Home.

HTH, SSF