Parallel::ForkManager doesn't help with the code you want to parallelize. However, it can keep track of the number of forks, which you mentioned you wanted to do in the original question.
Passing arguments is not a problem when using code references, if the aguments are determined beforehand, you can wrap them in anonymous subroutines:
sub sub1 { print "sub1 ran, got args: [@_]\n" }
sub sub2 { print "sub2 ran, got args: [@_]\n" }
my @refs = (
sub { sub1(1, 2, 3) },
sub { sub1('foo', 'bar') },
sub { sub2(4, 5, 6) },
sub { sub2('some', 'string') },
);
$_->() foreach @refs;
If you want to pass different sets of arguments to a single subroutine, you could just make an array of arguments:
sub foo { print "Got args: [@_]\n" }
my @args = (
[ 'A', 'B', 1 ],
[ 'C', 'D', 2 ],
);
foreach my $arg_ref (@args) {
foo(@$arg_ref)
}