simple_pool_manager.cc revision 11308
14997Sgblack@eecs.umich.edu/* 24997Sgblack@eecs.umich.edu * Copyright (c) 2015 Advanced Micro Devices, Inc. 34997Sgblack@eecs.umich.edu * All rights reserved. 44997Sgblack@eecs.umich.edu * 54997Sgblack@eecs.umich.edu * For use for simulation and test purposes only 64997Sgblack@eecs.umich.edu * 74997Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 84997Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are met: 94997Sgblack@eecs.umich.edu * 104997Sgblack@eecs.umich.edu * 1. Redistributions of source code must retain the above copyright notice, 114997Sgblack@eecs.umich.edu * this list of conditions and the following disclaimer. 124997Sgblack@eecs.umich.edu * 134997Sgblack@eecs.umich.edu * 2. Redistributions in binary form must reproduce the above copyright notice, 144997Sgblack@eecs.umich.edu * this list of conditions and the following disclaimer in the documentation 154997Sgblack@eecs.umich.edu * and/or other materials provided with the distribution. 164997Sgblack@eecs.umich.edu * 174997Sgblack@eecs.umich.edu * 3. Neither the name of the copyright holder nor the names of its contributors 184997Sgblack@eecs.umich.edu * may be used to endorse or promote products derived from this software 194997Sgblack@eecs.umich.edu * without specific prior written permission. 204997Sgblack@eecs.umich.edu * 214997Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 224997Sgblack@eecs.umich.edu * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 234997Sgblack@eecs.umich.edu * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 244997Sgblack@eecs.umich.edu * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 254997Sgblack@eecs.umich.edu * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 264997Sgblack@eecs.umich.edu * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 274997Sgblack@eecs.umich.edu * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 284997Sgblack@eecs.umich.edu * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 294997Sgblack@eecs.umich.edu * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 304997Sgblack@eecs.umich.edu * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 314997Sgblack@eecs.umich.edu * POSSIBILITY OF SUCH DAMAGE. 324997Sgblack@eecs.umich.edu * 334997Sgblack@eecs.umich.edu * Author: John Kalamatianos 344997Sgblack@eecs.umich.edu */ 354997Sgblack@eecs.umich.edu 365019Sgblack@eecs.umich.edu#include "gpu-compute/simple_pool_manager.hh" 375019Sgblack@eecs.umich.edu 385019Sgblack@eecs.umich.edu#include "base/misc.hh" 395019Sgblack@eecs.umich.edu 405019Sgblack@eecs.umich.edu// return the min number of elements that the manager can reserve given 415019Sgblack@eecs.umich.edu// a request for "size" elements 425019Sgblack@eecs.umich.eduuint32_t 435019Sgblack@eecs.umich.eduSimplePoolManager::minAllocatedElements(uint32_t size) 445019Sgblack@eecs.umich.edu{ 455019Sgblack@eecs.umich.edu fatal_if(size <= 0 || size > poolSize(), "Illegal VGPR region size=%d\n", 465019Sgblack@eecs.umich.edu size); 475019Sgblack@eecs.umich.edu 485019Sgblack@eecs.umich.edu return size % minAllocation() > 0 ? 495019Sgblack@eecs.umich.edu (minAllocation() - (size % minAllocation())) + size : size; 505019Sgblack@eecs.umich.edu} 515019Sgblack@eecs.umich.edu 525019Sgblack@eecs.umich.edustd::string 535019Sgblack@eecs.umich.eduSimplePoolManager::printRegion() 545014Sgblack@eecs.umich.edu{ 555014Sgblack@eecs.umich.edu std::string _cout; 565014Sgblack@eecs.umich.edu if (_reservedGroups == 0) 575014Sgblack@eecs.umich.edu _cout = "VRF is empty\n"; 585014Sgblack@eecs.umich.edu else if (_reservedGroups > 0) { 595014Sgblack@eecs.umich.edu uint32_t reservedEntries = _reservedGroups * _regionSize; 605014Sgblack@eecs.umich.edu _cout = "VRF reserves " + std::to_string(reservedEntries) + " VGPRs\n"; 615014Sgblack@eecs.umich.edu } 625014Sgblack@eecs.umich.edu 635014Sgblack@eecs.umich.edu return _cout; 645014Sgblack@eecs.umich.edu} 654997Sgblack@eecs.umich.edu 664997Sgblack@eecs.umich.edubool 674997Sgblack@eecs.umich.eduSimplePoolManager::canAllocate(uint32_t numRegions, uint32_t size) 684997Sgblack@eecs.umich.edu{ 694997Sgblack@eecs.umich.edu assert(numRegions * minAllocatedElements(size) <= poolSize()); 705034Smilesck@eecs.umich.edu 714997Sgblack@eecs.umich.edu return _reservedGroups == 0; 724997Sgblack@eecs.umich.edu} 734997Sgblack@eecs.umich.edu 744997Sgblack@eecs.umich.eduvoid 754997Sgblack@eecs.umich.eduSimplePoolManager::freeRegion(uint32_t firstIdx, uint32_t lastIdx) 765034Smilesck@eecs.umich.edu{ 774997Sgblack@eecs.umich.edu assert(_reservedGroups > 0); 78 --_reservedGroups; 79 80 if (!_reservedGroups) 81 _nxtFreeIdx = 0; 82} 83 84uint32_t 85SimplePoolManager::allocateRegion(const uint32_t size, 86 uint32_t *reservedPoolSize) 87{ 88 uint32_t actualSize = minAllocatedElements(size); 89 uint32_t startIdx = _nxtFreeIdx; 90 _nxtFreeIdx += actualSize; 91 _regionSize = actualSize; 92 assert(_nxtFreeIdx < poolSize()); 93 *reservedPoolSize = actualSize; 94 ++_reservedGroups; 95 96 return startIdx; 97} 98 99uint32_t 100SimplePoolManager::regionSize(std::pair<uint32_t, uint32_t> ®ion) 101{ 102 bool wrapAround = (region.first > region.second); 103 if (!wrapAround) { 104 return region.second - region.first + 1; 105 } else { 106 return region.second + poolSize() - region.first + 1; 107 } 108} 109