diff options
| author | Andrea Di Biagio <Andrea_DiBiagio@sn.scee.net> | 2018-11-30 17:15:52 +0000 | 
|---|---|---|
| committer | Andrea Di Biagio <Andrea_DiBiagio@sn.scee.net> | 2018-11-30 17:15:52 +0000 | 
| commit | 7e695b97d793388113baa5c194e1f9512476c845 (patch) | |
| tree | 543aef7ecd3e167b80db36923fec7a34f44f38d3 /llvm/tools/llvm-mca | |
| parent | e9870c0c9145a2b261054348c7979333b8ed6655 (diff) | |
| download | bcm5719-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.h | 6 | ||||
| -rw-r--r-- | llvm/tools/llvm-mca/lib/HardwareUnits/ResourceManager.cpp | 43 | 
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;  | 

