my %mythreads; my $work_package = int($elements / $number_threads + 0.5); my @ReturnData :shared; my $start = 0; my $stop = $start + $work_package * $files - 1; $stop = $elements * $files - 1 if ($stop >= $elements * $files); for (my $i = 0; $i < $number_threads; $i++) { $mythreads{$i} = threads->create(\&do_work); $start = $stop + 1; $stop += $work_package * $files; $stop = $elements * $files - 1 if ($stop >= $elements * $files); } # collect data foreach (sort(keys(%mythreads))) { $mythreads{$_}->join(); } #### sub do_work { my @working_block = @input_data[$start .. $stop]; my @partial_output_data; $, = undef; $\ = undef; my $output_line = 0; for (my $i = 0; $i < @working_block; $i += $files) { # calculates the stddev of each slice and outputs the formatted resuls if (max(@working_block[$i .. $i + $files - 1]) == 0) { $partial_output_data[$output_line] = '0.00000E+00'; } else { $partial_output_data[$output_line] = sprintf('%.5E', stddev(@working_block[$i .. $i + $files - 1]) / mean(@working_block[$i .. $i + $files - 1])); } $output_line++; } @ReturnData[$start / $files .. $stop / $files] = @partial_output_data; return; }