summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-mca
diff options
context:
space:
mode:
authorAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>2018-11-30 17:15:52 +0000
committerAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>2018-11-30 17:15:52 +0000
commit7e695b97d793388113baa5c194e1f9512476c845 (patch)
tree543aef7ecd3e167b80db36923fec7a34f44f38d3 /llvm/tools/llvm-mca
parente9870c0c9145a2b261054348c7979333b8ed6655 (diff)
downloadbcm5719-llvm-7e695b97d793388113baa5c194e1f9512476c845.tar.gz
bcm5719-llvm-7e695b97d793388113baa5c194e1f9512476c845.zip
[llvm-mca] Speedup the default resource selection strategy.
This patch removes a (potentially) slow while loop in DefaultResourceStrategy::select(). A better (and faster) approach is to do some bit manipulation in order to shrink the range of candidate resources. On a release build, this change gives an average speedup of ~10%. llvm-svn: 348007
Diffstat (limited to 'llvm/tools/llvm-mca')
-rw-r--r--llvm/tools/llvm-mca/include/HardwareUnits/ResourceManager.h6
-rw-r--r--llvm/tools/llvm-mca/lib/HardwareUnits/ResourceManager.cpp43
2 files changed, 31 insertions, 18 deletions
diff --git a/llvm/tools/llvm-mca/include/HardwareUnits/ResourceManager.h b/llvm/tools/llvm-mca/include/HardwareUnits/ResourceManager.h
index 065ead8f1a8..aa1bdb0440f 100644
--- a/llvm/tools/llvm-mca/include/HardwareUnits/ResourceManager.h
+++ b/llvm/tools/llvm-mca/include/HardwareUnits/ResourceManager.h
@@ -119,8 +119,6 @@ class DefaultResourceStrategy final : public ResourceStrategy {
/// on the overall performance of the tool.
uint64_t RemovedFromNextInSequence;
- void skipMask(uint64_t Mask);
-
public:
DefaultResourceStrategy(uint64_t UnitMask)
: ResourceStrategy(), ResourceUnitMask(UnitMask),
@@ -183,6 +181,8 @@ class ResourceState {
/// underlying units (i.e. pipelines) until the resource is released.
bool Unavailable;
+ const bool IsAGroup;
+
/// Checks for the availability of unit 'SubResMask' in the group.
bool isSubResourceReady(uint64_t SubResMask) const {
return ReadyMask & SubResMask;
@@ -210,7 +210,7 @@ public:
/// `NumUnits` available units.
bool isReady(unsigned NumUnits = 1) const;
- bool isAResourceGroup() const { return countPopulation(ResourceMask) > 1; }
+ bool isAResourceGroup() const { return IsAGroup; }
bool containsResource(uint64_t ID) const { return ResourceMask & ID; }
diff --git a/llvm/tools/llvm-mca/lib/HardwareUnits/ResourceManager.cpp b/llvm/tools/llvm-mca/lib/HardwareUnits/ResourceManager.cpp
index 3b0d7e4df54..f12238ab801 100644
--- a/llvm/tools/llvm-mca/lib/HardwareUnits/ResourceManager.cpp
+++ b/llvm/tools/llvm-mca/lib/HardwareUnits/ResourceManager.cpp
@@ -24,21 +24,28 @@ namespace mca {
#define DEBUG_TYPE "llvm-mca"
ResourceStrategy::~ResourceStrategy() = default;
-void DefaultResourceStrategy::skipMask(uint64_t Mask) {
- NextInSequenceMask &= (~Mask);
- if (!NextInSequenceMask) {
- NextInSequenceMask = ResourceUnitMask ^ RemovedFromNextInSequence;
- RemovedFromNextInSequence = 0;
- }
-}
-
uint64_t DefaultResourceStrategy::select(uint64_t ReadyMask) {
// This method assumes that ReadyMask cannot be zero.
- uint64_t CandidateMask = PowerOf2Floor(NextInSequenceMask);
- while (!(ReadyMask & CandidateMask)) {
- skipMask(CandidateMask);
- CandidateMask = PowerOf2Floor(NextInSequenceMask);
+ uint64_t CandidateMask = ReadyMask & NextInSequenceMask;
+ if (CandidateMask) {
+ CandidateMask = PowerOf2Floor(CandidateMask);
+ NextInSequenceMask &= (CandidateMask | (CandidateMask - 1));
+ return CandidateMask;
}
+
+ NextInSequenceMask = ResourceUnitMask ^ RemovedFromNextInSequence;
+ RemovedFromNextInSequence = 0;
+ CandidateMask = ReadyMask & NextInSequenceMask;
+
+ if (CandidateMask) {
+ CandidateMask = PowerOf2Floor(CandidateMask);
+ NextInSequenceMask &= (CandidateMask | (CandidateMask - 1));
+ return CandidateMask;
+ }
+
+ NextInSequenceMask = ResourceUnitMask;
+ CandidateMask = PowerOf2Floor(ReadyMask & NextInSequenceMask);
+ NextInSequenceMask &= (CandidateMask | (CandidateMask - 1));
return CandidateMask;
}
@@ -47,14 +54,20 @@ void DefaultResourceStrategy::used(uint64_t Mask) {
RemovedFromNextInSequence |= Mask;
return;
}
- skipMask(Mask);
+
+ NextInSequenceMask &= (~Mask);
+ if (NextInSequenceMask)
+ return;
+
+ NextInSequenceMask = ResourceUnitMask ^ RemovedFromNextInSequence;
+ RemovedFromNextInSequence = 0;
}
ResourceState::ResourceState(const MCProcResourceDesc &Desc, unsigned Index,
uint64_t Mask)
: ProcResourceDescIndex(Index), ResourceMask(Mask),
- BufferSize(Desc.BufferSize) {
- if (countPopulation(ResourceMask) > 1)
+ BufferSize(Desc.BufferSize), IsAGroup(countPopulation(ResourceMask)>1) {
+ if (IsAGroup)
ResourceSizeMask = ResourceMask ^ PowerOf2Floor(ResourceMask);
else
ResourceSizeMask = (1ULL << Desc.NumUnits) - 1;
OpenPOWER on IntegriCloud