diff options
| author | Andrea Di Biagio <Andrea_DiBiagio@sn.scee.net> | 2019-01-04 12:31:14 +0000 |
|---|---|---|
| committer | Andrea Di Biagio <Andrea_DiBiagio@sn.scee.net> | 2019-01-04 12:31:14 +0000 |
| commit | 7bec693433ee61728ca6841b3210f08d1559f183 (patch) | |
| tree | 6216bee979d24b07b41f003374747773e92b5b14 /llvm/lib/MCA | |
| parent | 4cebc9db04a29a8491b59e8178b4100d3c1a9c84 (diff) | |
| download | bcm5719-llvm-7bec693433ee61728ca6841b3210f08d1559f183.tar.gz bcm5719-llvm-7bec693433ee61728ca6841b3210f08d1559f183.zip | |
[MCA] Store extra information about processor resources in the ResourceManager.
Method ResourceManager::use() is responsible for updating the internal state of
used processor resources, as well as notifying resource groups that contain used
resources.
Before this patch, method 'use()' didn't know how to quickly obtain the set of
groups that contain a particular resource unit. It had to discover groups by
perform a potentially slow search (done by iterating over the set of processor
resource descriptors).
With this patch, the relationship between resource units and groups is stored in
the ResourceManager. That means, method 'use()' no longer has to search for
groups. This gives an average speedup of ~4-5% on a release build.
This patch also adds extra code comments in ResourceManager.h to better describe
the resource mask layout, and how resouce indices are computed from resource
masks.
llvm-svn: 350387
Diffstat (limited to 'llvm/lib/MCA')
| -rw-r--r-- | llvm/lib/MCA/HardwareUnits/ResourceManager.cpp | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp b/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp index 6c21b771330..c7f45fd9542 100644 --- a/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp +++ b/llvm/lib/MCA/HardwareUnits/ResourceManager.cpp @@ -115,10 +115,11 @@ getStrategyFor(const ResourceState &RS) { return std::unique_ptr<ResourceStrategy>(nullptr); } -ResourceManager::ResourceManager(const MCSchedModel &SM) { +ResourceManager::ResourceManager(const MCSchedModel &SM) + : Resources(SM.getNumProcResourceKinds()), + Strategies(SM.getNumProcResourceKinds()), + Resource2Groups(SM.getNumProcResourceKinds(), 0) { computeProcResourceMasks(SM, ProcResID2Mask); - Resources.resize(SM.getNumProcResourceKinds()); - Strategies.resize(SM.getNumProcResourceKinds()); for (unsigned I = 0, E = SM.getNumProcResourceKinds(); I < E; ++I) { uint64_t Mask = ProcResID2Mask[I]; @@ -127,6 +128,24 @@ ResourceManager::ResourceManager(const MCSchedModel &SM) { llvm::make_unique<ResourceState>(*SM.getProcResource(I), I, Mask); Strategies[Index] = getStrategyFor(*Resources[Index]); } + + for (unsigned I = 0, E = SM.getNumProcResourceKinds(); I < E; ++I) { + uint64_t Mask = ProcResID2Mask[I]; + unsigned Index = getResourceStateIndex(Mask); + const ResourceState &RS = *Resources[Index]; + if (!RS.isAResourceGroup()) + continue; + + uint64_t GroupMaskIdx = 1ULL << (Index - 1); + Mask -= GroupMaskIdx; + while (Mask) { + // Extract lowest set isolated bit. + uint64_t Unit = Mask & (-Mask); + unsigned IndexUnit = getResourceStateIndex(Unit); + Resource2Groups[IndexUnit] |= GroupMaskIdx; + Mask ^= Unit; + } + } } void ResourceManager::setCustomStrategyImpl(std::unique_ptr<ResourceStrategy> S, @@ -179,17 +198,16 @@ void ResourceManager::use(const ResourceRef &RR) { if (RS.isReady()) return; - // Notify to other resources that RR.first is no longer available. - for (std::unique_ptr<ResourceState> &Res : Resources) { - ResourceState &Current = *Res; - if (!Current.isAResourceGroup() || Current.getResourceMask() == RR.first) - continue; - - if (Current.containsResource(RR.first)) { - unsigned Index = getResourceStateIndex(Current.getResourceMask()); - Current.markSubResourceAsUsed(RR.first); - Strategies[Index]->used(RR.first); - } + // Notify groups that RR.first is no longer available. + uint64_t Users = Resource2Groups[RSID]; + while (Users) { + // Extract lowest set isolated bit. + unsigned GroupIndex = getResourceStateIndex(Users & (-Users)); + ResourceState &CurrentUser = *Resources[GroupIndex]; + CurrentUser.markSubResourceAsUsed(RR.first); + Strategies[GroupIndex]->used(RR.first); + // Reset lowest set bit. + Users &= Users - 1; } } |

