1/* 2 * Copyright (c) 2015 Advanced Micro Devices, Inc. 3 * All rights reserved. 4 * 5 * For use for simulation and test purposes only 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright notice, 11 * this list of conditions and the following disclaimer. 12 * 13 * 2. Redistributions in binary form must reproduce the above copyright notice, 14 * this list of conditions and the following disclaimer in the documentation 15 * and/or other materials provided with the distribution. 16 * 17 * 3. Neither the name of the copyright holder nor the names of its 18 * contributors may be used to endorse or promote products derived from this 19 * software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31 * POSSIBILITY OF SUCH DAMAGE. 32 * 33 * Authors: John Kalamatianos 34 */ 35 36#include "gpu-compute/simple_pool_manager.hh" 37 38#include "base/logging.hh" 39 40// return the min number of elements that the manager can reserve given 41// a request for "size" elements 42uint32_t 43SimplePoolManager::minAllocatedElements(uint32_t size) 44{ 45 fatal_if(size <= 0 || size > poolSize(), "Illegal VGPR region size=%d\n", 46 size); 47 48 return size % minAllocation() > 0 ? 49 (minAllocation() - (size % minAllocation())) + size : size; 50} 51 52std::string 53SimplePoolManager::printRegion() 54{ 55 std::string _cout; 56 if (_reservedGroups == 0) 57 _cout = "VRF is empty\n"; 58 else if (_reservedGroups > 0) { 59 uint32_t reservedEntries = _reservedGroups * _regionSize; 60 _cout = "VRF reserves " + std::to_string(reservedEntries) + " VGPRs\n"; 61 } 62 63 return _cout; 64} 65 66bool 67SimplePoolManager::canAllocate(uint32_t numRegions, uint32_t size) 68{ 69 assert(numRegions * minAllocatedElements(size) <= poolSize()); 70 71 return _reservedGroups == 0; 72} 73 74void 75SimplePoolManager::freeRegion(uint32_t firstIdx, uint32_t lastIdx) 76{ 77 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