Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Composing High-Performance  Memory Allocators Emery Berger , Ben Zorn, Kathryn McKinley
Motivation & Contributions <ul><li>Programs increasingly allocation intensive </li></ul><ul><ul><li>spend more than half o...
Outline <ul><li>High-performance memory allocators </li></ul><ul><ul><li>focus on custom allocators </li></ul></ul><ul><ul...
Using Custom Allocators <ul><li>Can be very fast: </li></ul><ul><ul><li>Linked lists of objects for highly-used classes </...
Custom Allocators Work <ul><li>Using a custom allocator reduces runtime by 60% </li></ul>
Problems with Current Practice <ul><li>Brittle code </li></ul><ul><ul><li>written from scratch  </li></ul></ul><ul><ul><li...
Allocator Conceptual Design <ul><li>People think & talk about heaps  as if  they were modular: </li></ul>Select heap based...
Infrastructure Requirements <ul><li>Flexible </li></ul><ul><ul><li>can add functionality </li></ul></ul><ul><li>Reusable <...
Possible Solutions  virtual method overhead function call overhead Fast   function-pointer assignment High-level   Mi...
Ordinary Classes vs. Mixins <ul><li>Ordinary classes </li></ul><ul><ul><li>fixed inheritance dag </li></ul></ul><ul><ul><l...
A Heap Layer void * malloc (sz) {   do something;   void * p = SuperHeap::malloc (sz);   do something else;   return p; } ...
Example: Thread-safety <ul><li>LockedHeap </li></ul><ul><ul><li>protects the parent heap with a single lock </li></ul></ul...
Example: Debugging <ul><li>DebugHeap </li></ul><ul><ul><li>Protects against invalid & multiple frees.  </li></ul></ul>Debu...
Implementation in Heap Layers <ul><li>Modular design  and  implementation </li></ul>SegHeap malloc free SizeHeap FreelistH...
Experimental Methodology <ul><li>Built replacement allocators using heap layers </li></ul><ul><ul><li>custom allocators: <...
Experimental Results: Custom Allocation – gcc
Experimental Results: General-Purpose Allocators
Experimental Results: General-Purpose Allocators
Conclusion <ul><li>Heap layers infrastructure for composing allocators </li></ul><ul><li>Useful experimental infrastructur...
 
A Library of Heap Layers <ul><li>Top heaps </li></ul><ul><ul><li>mallocHeap ,  mmapHeap ,  sbrkHeap </li></ul></ul><ul><li...
Heap Layers as Experimental Infrastructure <ul><li>Kingsley allocator </li></ul><ul><ul><li>averages 50% internal fragment...
Upcoming SlideShare
Loading in …5
×

Composing High-Performance Memory Allocators with Heap Layers

5,933 views

Published on

Heap Layers is a template-based infrastructure for building high-quality, fast memory allocators. The infrastructure is remarkably flexible, and the resulting memory allocators are as fast or faster than counterparts written in conventional C or C++. We have built several industrial-strength allocators using Heap Layers, including Hoard (which now includes the Heap Layers infrastructure) and DieHard.

Published in: Technology
  • Be the first to comment

Composing High-Performance Memory Allocators with Heap Layers

  1. 1. Composing High-Performance Memory Allocators Emery Berger , Ben Zorn, Kathryn McKinley
  2. 2. Motivation & Contributions <ul><li>Programs increasingly allocation intensive </li></ul><ul><ul><li>spend more than half of runtime in malloc / free </li></ul></ul><ul><li> programmers require high performance allocators </li></ul><ul><ul><li>often build own custom allocators </li></ul></ul><ul><li>Heap layers infrastructure for building memory allocators </li></ul><ul><ul><li>composable, extensible, and high-performance </li></ul></ul><ul><ul><li>based on C++ templates </li></ul></ul><ul><ul><li>custom and general-purpose, competitive with state-of-the-art </li></ul></ul>
  3. 3. Outline <ul><li>High-performance memory allocators </li></ul><ul><ul><li>focus on custom allocators </li></ul></ul><ul><ul><li>pros & cons of current practice </li></ul></ul><ul><li>Previous work </li></ul><ul><li>Heap layers </li></ul><ul><ul><li>how it works </li></ul></ul><ul><ul><li>examples </li></ul></ul><ul><li>Experimental results </li></ul><ul><ul><li>custom & general-purpose allocators </li></ul></ul>
  4. 4. Using Custom Allocators <ul><li>Can be very fast: </li></ul><ul><ul><li>Linked lists of objects for highly-used classes </li></ul></ul><ul><ul><li>Region (arena, zone) allocators </li></ul></ul><ul><li>“ Best practices” [Meyers 1995, Bulka 2001] </li></ul><ul><ul><li>Used in 3 SPEC2000 benchmarks (parser, gcc, vpr), Apache, PGP, SQLServer, etc. </li></ul></ul>
  5. 5. Custom Allocators Work <ul><li>Using a custom allocator reduces runtime by 60% </li></ul>
  6. 6. Problems with Current Practice <ul><li>Brittle code </li></ul><ul><ul><li>written from scratch </li></ul></ul><ul><ul><li>macros/monolithic functions to avoid overhead </li></ul></ul><ul><ul><li>hard to write, reuse or maintain </li></ul></ul><ul><li>Excessive fragmentation </li></ul><ul><ul><li>good memory allocators: complicated, not retargetable </li></ul></ul>
  7. 7. Allocator Conceptual Design <ul><li>People think & talk about heaps as if they were modular: </li></ul>Select heap based on size malloc free Manage small objects System memory manager Manage large objects
  8. 8. Infrastructure Requirements <ul><li>Flexible </li></ul><ul><ul><li>can add functionality </li></ul></ul><ul><li>Reusable </li></ul><ul><ul><li>in other contexts & in same program </li></ul></ul><ul><li>Fast </li></ul><ul><ul><li>very low or no overhead </li></ul></ul><ul><li>High-level </li></ul><ul><ul><li>as component-like as possible </li></ul></ul>
  9. 9. Possible Solutions  virtual method overhead function call overhead Fast   function-pointer assignment High-level   Mixins (our approach) rigid hierarchy  Object-oriented (CMM [Attardi et al. 1998])   Indirect function calls (Vmalloc [Vo 1996]) Reusable Flexible
  10. 10. Ordinary Classes vs. Mixins <ul><li>Ordinary classes </li></ul><ul><ul><li>fixed inheritance dag </li></ul></ul><ul><ul><li>can’t rearrange hierarchy </li></ul></ul><ul><ul><li>can’t use class multiple times </li></ul></ul><ul><li>Mixins </li></ul><ul><ul><li>no fixed inheritance dag </li></ul></ul><ul><ul><li>multiple hierarchies possible </li></ul></ul><ul><ul><li>can reuse classes </li></ul></ul><ul><ul><li>fast: static dispatch </li></ul></ul>
  11. 11. A Heap Layer void * malloc (sz) { do something; void * p = SuperHeap::malloc (sz); do something else; return p; } heap layer <ul><ul><li>template <class SuperHeap> class HeapLayer : public SuperHeap {…}; </li></ul></ul><ul><li>Provides malloc and free methods </li></ul><ul><li>“ Top heaps” get memory from system </li></ul><ul><ul><li>e.g., mallocHeap uses C library’s malloc and free </li></ul></ul>
  12. 12. Example: Thread-safety <ul><li>LockedHeap </li></ul><ul><ul><li>protects the parent heap with a single lock </li></ul></ul>void * malloc (sz) { acquire lock; void * p = release lock; return p; } class LockedMallocHeap: public LockedHeap<mallocHeap> {}; SuperHeap::malloc (sz); LockedHeap mallocHeap
  13. 13. Example: Debugging <ul><li>DebugHeap </li></ul><ul><ul><li>Protects against invalid & multiple frees. </li></ul></ul>DebugHeap class LockedDebugMallocHeap: public LockedHeap< DebugHeap<mallocHeap> > {}; LockedHeap void free (p) { check that p is valid; check that p hasn’t been freed before; } SuperHeap::free (p); mallocHeap
  14. 14. Implementation in Heap Layers <ul><li>Modular design and implementation </li></ul>SegHeap malloc free SizeHeap FreelistHeap manage objects on freelist add size info to objects select heap based on size
  15. 15. Experimental Methodology <ul><li>Built replacement allocators using heap layers </li></ul><ul><ul><li>custom allocators: </li></ul></ul><ul><ul><ul><li>XallocHeap (197.parser), ObstackHeap (176.gcc) </li></ul></ul></ul><ul><ul><li>general-purpose allocators: </li></ul></ul><ul><ul><ul><li>KingsleyHeap (BSD allocator) </li></ul></ul></ul><ul><ul><ul><li>LeaHeap (based on Lea allocator 2.7.0) </li></ul></ul></ul><ul><ul><ul><ul><li>three weeks to develop </li></ul></ul></ul></ul><ul><ul><ul><ul><li>500 lines vs. 2,000 lines in original </li></ul></ul></ul></ul><ul><li>Compared performance with original allocators </li></ul><ul><ul><li>SPEC benchmarks & standard allocation benchmarks </li></ul></ul>
  16. 16. Experimental Results: Custom Allocation – gcc
  17. 17. Experimental Results: General-Purpose Allocators
  18. 18. Experimental Results: General-Purpose Allocators
  19. 19. Conclusion <ul><li>Heap layers infrastructure for composing allocators </li></ul><ul><li>Useful experimental infrastructure </li></ul><ul><li>Allows rapid implementation of high-quality allocators </li></ul><ul><ul><li>custom allocators as fast as originals </li></ul></ul><ul><ul><li>general-purpose allocators comparable to state-of-the-art in speed and efficiency </li></ul></ul>
  20. 21. A Library of Heap Layers <ul><li>Top heaps </li></ul><ul><ul><li>mallocHeap , mmapHeap , sbrkHeap </li></ul></ul><ul><li>Building-blocks </li></ul><ul><ul><li>AdaptHeap , FreelistHeap , CoalesceHeap </li></ul></ul><ul><li>Combining heaps </li></ul><ul><ul><li>HybridHeap , TryHeap , SegHeap , StrictSegHeap </li></ul></ul><ul><li>Utility layers </li></ul><ul><ul><li>ANSIWrapper , DebugHeap , LockedHeap , PerClassHeap , STLAdapter </li></ul></ul>
  21. 22. Heap Layers as Experimental Infrastructure <ul><li>Kingsley allocator </li></ul><ul><ul><li>averages 50% internal fragmentation </li></ul></ul><ul><ul><li>what’s the impact of adding coalescing? </li></ul></ul><ul><li>Just add coalescing layer </li></ul><ul><ul><li>two lines of code! </li></ul></ul><ul><li>Result: </li></ul><ul><ul><li>Almost as memory-efficient as Lea allocator </li></ul></ul><ul><ul><li>Reasonably fast for all but most allocation-intensive apps </li></ul></ul>

×