--- ray/src/util/genBSDF.pl 2011/06/24 00:41:51 2.22 +++ ray/src/util/genBSDF.pl 2011/10/27 16:35:54 2.27 @@ -1,5 +1,5 @@ #!/usr/bin/perl -w -# RCSid $Id: genBSDF.pl,v 2.22 2011/06/24 00:41:51 greg Exp $ +# RCSid $Id: genBSDF.pl,v 2.27 2011/10/27 16:35:54 greg Exp $ # # Compute BSDF based on geometry and material description # @@ -16,13 +16,14 @@ chomp $td; my @savedARGV = @ARGV; my $tensortree = 0; my $ttlog2 = 4; -my $nsamp = 1000; +my $nsamp = 2000; my $rtargs = "-w -ab 5 -ad 700 -lw 3e-6"; my $mgfin = 0; my $geout = 1; my $nproc = 1; my $doforw = 0; my $doback = 1; +my $pctcull = 95; my $gunit = "Meter"; my @dim; # Get options @@ -43,6 +44,9 @@ while ($#ARGV >= 0) { $doforw = ("$ARGV[0]" =~ /^\+/); } elsif ("$ARGV[0]" =~ /^[-+]b/) { $doback = ("$ARGV[0]" =~ /^\+/); + } elsif ("$ARGV[0]" eq "-t") { + $pctcull = $ARGV[1]; + shift @ARGV; } elsif ("$ARGV[0]" =~ /^-t[34]$/) { $tensortree = substr($ARGV[0], 2, 1); $ttlog2 = $ARGV[1]; @@ -149,26 +153,34 @@ print '; # Clean up temporary files and exit -if ( $persistfile && open(PFI, "< $persistfile") ) { - while () { - s/^[^ ]* //; - kill('ALRM', $_); - last; - } - close PFI; -} exec("rm -rf $td"); #-------------- End of main program segment --------------# +#++++++++++++++ Kill persistent rtrace +++++++++++++++++++# +sub persist_end { + if ( $persistfile && open(PFI, "< $persistfile") ) { + while () { + s/^[^ ]* //; + kill('ALRM', $_); + last; + } + close PFI; + } +} + #++++++++++++++ Tensor tree BSDF generation ++++++++++++++# sub do_tree_bsdf { # Get sampling rate and subdivide task my $ns2 = $ns; $ns2 /= 2 if ( $tensortree == 3 ); -@pdiv = (0, int($ns2/$nproc)); -my $nrem = $ns2 % $nproc; -for (my $i = 1; $i < $nproc; $i++) { +my $nsplice = $nproc; +$nsplice *= 10 if ($nproc > 1); +$nsplice = $ns2 if ($nsplice > $ns2); +$nsplice = 999 if ($nsplice > 999); +@pdiv = (0, int($ns2/$nsplice)); +my $nrem = $ns2 % $nsplice; +for (my $i = 1; $i < $nsplice; $i++) { my $nv = $pdiv[$i] + $pdiv[1]; ++$nv if ( $nrem-- > 0 ); push @pdiv, $nv; @@ -217,27 +229,44 @@ print "\t\n"; print "\t\tTensorTree$tensortree\n"; print "\t\n"; # Fork parallel rtcontrib processes to compute each side +my $npleft = $nproc; if ( $doback ) { - for (my $proc = 0; $proc < $nproc; $proc++) { - bg_tree_rtcontrib(0, $proc); + for (my $splice = 0; $splice < $nsplice; $splice++) { + if (! $npleft ) { + wait(); + die "rtcontrib process reported error" if ( $? ); + $npleft++; + } + bg_tree_rtcontrib(0, $splice); + $npleft--; } while (wait() >= 0) { die "rtcontrib process reported error" if ( $? ); + $npleft++; } + persist_end(); ttree_out(0); } if ( $doforw ) { - for (my $proc = 0; $proc < $nproc; $proc++) { - bg_tree_rtcontrib(1, $proc); + for (my $splice = 0; $splice < $nsplice; $splice++) { + if (! $npleft ) { + wait(); + die "rtcontrib process reported error" if ( $? ); + $npleft++; + } + bg_tree_rtcontrib(1, $splice); + $npleft--; } while (wait() >= 0) { die "rtcontrib process reported error" if ( $? ); + $npleft++; } + persist_end(); ttree_out(1); } } # end of sub do_tree_bsdf() -# Run i'th rtcontrib process for generating tensor tree samples +# Run rtcontrib process in background to generate tensor tree samples sub bg_tree_rtcontrib { my $pid = fork(); die "Cannot fork new process" unless defined $pid; @@ -309,7 +338,7 @@ print system "rcalc -if3 -e 'Omega:PI/($ns*$ns)' " . q{-e '$1=(0.265*$1+0.670*$2+0.065*$3)/Omega' -of } . "$td/" . ($bmodnm,$fmodnm)[$forw] . "_???.flt " . - "| rttree_reduce -h -ff -r $tensortree -g $ttlog2"; + "| rttree_reduce -h -ff -t $pctcull -r $tensortree -g $ttlog2"; die "Failure running rttree_reduce" if ( $? ); print ' @@ -335,7 +364,7 @@ print system "rcalc -if3 -e 'Omega:PI/($ns*$ns)' " . q{-e '$1=(0.265*$1+0.670*$2+0.065*$3)/Omega' -of } . "$td/" . ($fmodnm,$bmodnm)[$forw] . "_???.flt " . - "| rttree_reduce -h -ff -r $tensortree -g $ttlog2"; + "| rttree_reduce -h -ff -t $pctcull -r $tensortree -g $ttlog2"; die "Failure running rttree_reduce" if ( $? ); print '