DemandExecutableAllocator() : MetaAllocator(jitAllocationGranule) { std::lock_guard<StaticLock> lock(allocatorsMutex()); allocators().add(this); // Don't preallocate any memory here. }
static size_t bytesCommittedByAllocactors() { size_t total = 0; std::lock_guard<StaticLock> lock(allocatorsMutex()); for (HashSet<DemandExecutableAllocator*>::const_iterator allocator = allocators().begin(); allocator != allocators().end(); ++allocator) total += (*allocator)->bytesCommitted(); return total; }
virtual ~DemandExecutableAllocator() { { std::lock_guard<StaticLock> lock(allocatorsMutex()); allocators().remove(this); } for (unsigned i = 0; i < reservations.size(); ++i) reservations.at(i).deallocate(); }
static void dumpProfileFromAllAllocators() { std::lock_guard<StaticLock> lock(allocatorsMutex()); for (HashSet<DemandExecutableAllocator*>::const_iterator allocator = allocators().begin(); allocator != allocators().end(); ++allocator) (*allocator)->dumpProfile(); }
// // StencilTables factory // StencilTables const * StencilTablesFactory::Create(TopologyRefiner const & refiner, Options options) { StencilTables * result = new StencilTables; int maxlevel = std::min(int(options.maxLevel), refiner.GetMaxLevel()); if (maxlevel==0 and (not options.generateControlVerts)) { return result; } // 'maxsize' reflects the size of the default supporting basis factorized // in the stencils, with a little bit of head-room. Each subdivision scheme // has a set valence for 'regular' vertices, which drives the size of the // supporting basis of control-vertices. The goal is to reduce the number // of incidences where the pool allocator has to switch to dynamically // allocated heap memory when encountering extraordinary vertices that // require a larger supporting basis. // // The maxsize settings we use follow the assumption that the vast // majority of the vertices in a mesh are regular, and that the valence // of the extraordinary vertices is only higher by 1 edge. int maxsize = 0; bool interpolateVarying = false; switch (options.interpolationMode) { case INTERPOLATE_VERTEX: { Sdc::SchemeType type = refiner.GetSchemeType(); switch (type) { case Sdc::SCHEME_BILINEAR : maxsize = 5; break; case Sdc::SCHEME_CATMARK : maxsize = 17; break; case Sdc::SCHEME_LOOP : maxsize = 10; break; default: assert(0); } } break; case INTERPOLATE_VARYING: maxsize = 5; interpolateVarying=true; break; default: assert(0); } std::vector<StencilAllocator> allocators( options.generateIntermediateLevels ? maxlevel+1 : 2, StencilAllocator(maxsize, interpolateVarying)); StencilAllocator * srcAlloc = &allocators[0], * dstAlloc = &allocators[1]; // // Interpolate stencils for each refinement level using // TopologyRefiner::InterpolateLevel<>() // for (int level=1;level<=maxlevel; ++level) { dstAlloc->Resize(refiner.GetNumVertices(level)); if (options.interpolationMode==INTERPOLATE_VERTEX) { refiner.Interpolate(level, *srcAlloc, *dstAlloc); } else { refiner.InterpolateVarying(level, *srcAlloc, *dstAlloc); } if (options.generateIntermediateLevels) { if (level<maxlevel) { if (options.factorizeIntermediateLevels) { srcAlloc = &allocators[level]; } else { // if the stencils are dependent on the previous level of // subdivision, pass an empty allocator to treat all parent // vertices as control vertices assert(allocators[0].GetNumStencils()==0); } dstAlloc = &allocators[level+1]; } } else { std::swap(srcAlloc, dstAlloc); } } // Copy stencils from the pool allocator into the tables { // Add total number of stencils, weights & indices int nelems = 0, nstencils=0; if (options.generateIntermediateLevels) { for (int level=0; level<=maxlevel; ++level) { nstencils += allocators[level].GetNumStencils(); nelems += allocators[level].GetNumVerticesTotal(); } } else { nstencils = (int)srcAlloc->GetNumStencils(); nelems = srcAlloc->GetNumVerticesTotal(); } // Allocate result->_numControlVertices = refiner.GetNumVertices(0); if (options.generateControlVerts) { nstencils += result->_numControlVertices; nelems += result->_numControlVertices; } result->resize(nstencils, nelems); // Copy stencils Stencil dst(&result->_sizes.at(0), &result->_indices.at(0), &result->_weights.at(0)); if (options.generateControlVerts) { generateControlVertStencils(result->_numControlVertices, dst); } if (options.generateIntermediateLevels) { for (int level=1; level<=maxlevel; ++level) { for (int i=0; i<allocators[level].GetNumStencils(); ++i) { *dst._size = allocators[level].CopyStencil(i, dst._indices, dst._weights); dst.Next(); } } } else { for (int i=0; i<srcAlloc->GetNumStencils(); ++i) { *dst._size = srcAlloc->CopyStencil(i, dst._indices, dst._weights); dst.Next(); } } if (options.generateOffsets) { result->generateOffsets(); } } return result; }