[vtk-developers] Garbage collection slowness

Hank Childs childs3 at llnl.gov
Tue May 13 09:47:19 EDT 2008


Hi Berk & Brad,

Thanks very much for your responses; your interest is much appreciated.

To answer one of Brad's question, I am having a problem reproducing  
the problem with a minimal test program, which probably means  
something.  I will continue working on this.

I got interested in the garbage collector because I was doing "poor  
man's profiling" (see footnote [1] below for more explanation) and I  
kept observing that garbage collection was dominating.

To answer Berk's question, yes, I was unclear.  Here is the general  
setup:  We are very memory conscious, so we dereference the inputs to  
a filter after the filter has executed (see footnote [2] below for  
more explanation).  So:

for ( 20000 )
    filt->SetInput(input[i]);
    filt->Update();
    output[i] = filt->GetOutput()->NewInstance();
    output[i]->ShallowCopy(filt->GetOutput());

for (20000)
    input[i]->Delete();

I found that the Delete() calls were taking a huge amount of time.   
So I wrapped them with:

vtkGarbageCollector::Push()
for (20000)
    input[i]->Delete();
vtkGarbageCollector::Pop()

and found that that improved the situation (supporting Brad's claim  
that it should be faster), but it was still taking a long time.  I  
have also found variation in the run times, meaning that my OS may  
have a role here too, likely in terms of lots of small allocations  
and deallocations.

I don't think that I was very clear in my last email, so I want to  
try again.  My only evidence against garbage collection is that my  
poor man's profiling shows that my program is doing garbage  
collection the majority of the time.

Instead of raising the garbage collection issue, the tack I should  
have taken is to ask why it was taking 47s to delete the output, when  
it took only 20s to create it, as well as executing the filters.  Of  
course, I would greatly help my cause here if I could get a simple  
reproducer that people could sink their teeth into.  So, again, I'll  
continue pursuing that...

Best,
Hank

[1] poor man's profiling means connecting with a debugger regularly  
and seeing where the work was happening ... I have had problems  
getting profilers to run on big software projects and I find this to  
be somewhat effective.

[2] As you all know, there is a tradeoff between reusing cached  
results (what VTK does by default) and keeping memory low (what I am  
doing manually).  Of course, VTK does a good job of minimizing the  
overhead for reusing cached results by often sharing references  
between input and output.  Regardless, there is often memory  
associated with the input that is not needed in the output.  For what  
I'm working on, harvesting that memory is worthwhile.  Also, I  
mitigate the loss of reusing cached results somewhat by keeping a  
cache for all I/O (... and I have found that I/O is often the  
bottleneck).

On May 13, 2008, at 6:15 AM, Berk Geveci wrote:

> Hi Hank,
>
> Where is the big loop over 20000 items happening? Around the Push/Pop
> or inside them?
>
> -berk
>
> On Mon, May 12, 2008 at 6:35 PM, Hank Childs <childs3 at llnl.gov> wrote:
>>
>>  Hello VTK Developers!
>>
>>  I am running in serial and am setting up about 20000 pipelines on  
>> my serial
>> process for about 20000 chunks of data.
>>
>>  The runtime has gotten disproportionately large with the large  
>> number of
>> chunks and I believe that garbage collection is at least partly to  
>> blame.
>>
>>  For example, if I:
>>  1) call vtkGarbageCollector::DeferredCollectionPush()
>>  2) execute three filters (filters that find external faces and  
>> remove ghost
>> data) and,
>>  3) call vtkGarbageCollector::DeferredCollectionPop()
>>
>>  then: the three filters take about 20s total and the  
>> DeferredCollectionPop
>> takes about 47s.
>>
>>  One conclusion that I drew from the fast execution of the three  
>> filters, is
>> that iterating through the data is relatively quickly.  Restated,  
>> I ruled
>> out thrashing through memory as the reason the garbage collector  
>> is taking
>> 47s.
>>
>>  Also, I should disclose that I am managing the execution  
>> manually.  The
>> best way to describe it would be that I have one instance of  
>> filter A, one
>> instance of filter B, and one instance of filter C and that I  
>> route all 20K
>> data sets through filter A, to make 20K new data sets, then route  
>> those 20K
>> new data sets through B, and so on.  Also, I know that the  
>> alternative is to
>> call "Update()" 20K times, one for each chunk, but I'd prefer not  
>> to go down
>> that route, for reasons I can explain if necessary.
>>
>>  So: can anyone point me to some words of wisdom about a way to  
>> manage my
>> data objects so that garbage collection is faster?
>>
>>  Best regards,
>>  Hank_______________________________________________
>>  vtk-developers mailing list
>>  vtk-developers at vtk.org
>>  http://www.vtk.org/mailman/listinfo/vtk-developers
>>




More information about the vtk-developers mailing list