[llvm] r340395 - [llvm-mca] Improved code comments and moved some method definitions from Scheduler.h to Scheduler.cpp. NFC
Andrea Di Biagio via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 22 03:23:29 PDT 2018
Author: adibiagio
Date: Wed Aug 22 03:23:28 2018
New Revision: 340395
URL: http://llvm.org/viewvc/llvm-project?rev=340395&view=rev
Log:
[llvm-mca] Improved code comments and moved some method definitions from Scheduler.h to Scheduler.cpp. NFC
Modified:
llvm/trunk/tools/llvm-mca/Scheduler.cpp
llvm/trunk/tools/llvm-mca/Scheduler.h
Modified: llvm/trunk/tools/llvm-mca/Scheduler.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mca/Scheduler.cpp?rev=340395&r1=340394&r2=340395&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-mca/Scheduler.cpp (original)
+++ llvm/trunk/tools/llvm-mca/Scheduler.cpp Wed Aug 22 03:23:28 2018
@@ -22,6 +22,34 @@ using namespace llvm;
#define DEBUG_TYPE "llvm-mca"
+ResourceState::ResourceState(const llvm::MCProcResourceDesc &Desc,
+ unsigned Index, uint64_t Mask)
+ : ProcResourceDescIndex(Index), ResourceMask(Mask) {
+ if (llvm::countPopulation(ResourceMask) > 1)
+ ResourceSizeMask = ResourceMask ^ llvm::PowerOf2Floor(ResourceMask);
+ else
+ ResourceSizeMask = (1ULL << Desc.NumUnits) - 1;
+ NextInSequenceMask = ResourceSizeMask;
+ RemovedFromNextInSequence = 0;
+ ReadyMask = ResourceSizeMask;
+ BufferSize = Desc.BufferSize;
+ AvailableSlots = BufferSize == -1 ? 0U : static_cast<unsigned>(BufferSize);
+ Unavailable = false;
+}
+
+bool ResourceState::isReady(unsigned NumUnits) const {
+ return (!isReserved() || isADispatchHazard()) &&
+ llvm::countPopulation(ReadyMask) >= NumUnits;
+}
+
+ResourceStateEvent ResourceState::isBufferAvailable() const {
+ if (isADispatchHazard() && isReserved())
+ return RS_RESERVED;
+ if (!isBuffered() || AvailableSlots)
+ return RS_BUFFER_AVAILABLE;
+ return RS_BUFFER_UNAVAILABLE;
+}
+
uint64_t ResourceState::selectNextInSequence() {
assert(isReady());
uint64_t Next = getNextInSequence();
@@ -308,8 +336,7 @@ void Scheduler::issueInstructionImpl(
// Release the buffered resources and issue the instruction.
void Scheduler::issueInstruction(
- InstRef &IR,
- SmallVectorImpl<std::pair<ResourceRef, double>> &UsedResources,
+ InstRef &IR, SmallVectorImpl<std::pair<ResourceRef, double>> &UsedResources,
SmallVectorImpl<InstRef> &ReadyInstructions) {
const Instruction &Inst = *IR.getInstruction();
bool HasDependentUsers = Inst.hasDependentUsers();
Modified: llvm/trunk/tools/llvm-mca/Scheduler.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mca/Scheduler.h?rev=340395&r1=340394&r2=340395&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-mca/Scheduler.h (original)
+++ llvm/trunk/tools/llvm-mca/Scheduler.h Wed Aug 22 03:23:28 2018
@@ -46,31 +46,27 @@ enum ResourceStateEvent {
RS_RESERVED
};
-/// A descriptor for processor resources.
+/// A processor resource descriptor.
///
-/// Each object of class ResourceState is associated to a specific processor
-/// resource. There is an instance of this class for every processor resource
-/// defined by the scheduling model.
-/// A ResourceState dynamically tracks the availability of units of a processor
-/// resource. For example, the ResourceState of a ProcResGroup tracks the
-/// availability of resource units which are part of the group.
-///
-/// Internally, ResourceState uses a round-robin selector to identify
-/// which unit of the group shall be used next.
+/// There is an instance of this class for every processor resource defined by
+/// the machine scheduling model.
+/// Objects of class ResourceState dynamically track the usage of processor
+/// resource units.
class ResourceState {
- // Index to the MCProcResourceDesc in the processor Model.
+ /// An index to the MCProcResourceDesc entry in the processor model.
unsigned ProcResourceDescIndex;
- // A resource mask. This is generated by the tool with the help of
- // function `mca::createProcResourceMasks' (see Support.h).
+ /// A resource mask. This is generated by the tool with the help of
+ /// function `mca::createProcResourceMasks' (see Support.h).
uint64_t ResourceMask;
- // A ProcResource can specify a number of units. For the purpose of dynamic
- // scheduling, a processor resource with more than one unit behaves like a
- // group. This field has one bit set for every unit/resource that is part of
- // the group.
- // For groups, this field defaults to 'ResourceMask'. For non-group
- // resources, the number of bits set in this mask is equivalent to the
- // number of units (i.e. field 'NumUnits' in 'ProcResourceUnits').
+ /// A ProcResource can have multiple units.
+ ///
+ /// For processor resource groups,
+ /// this field default to the value of field `ResourceMask`; the number of
+ /// bits set is equal to the cardinality of the group. For normal (i.e.
+ /// non-group) resources, the number of bits set in this mask is equivalent
+ /// to the number of units declared by the processor model (see field
+ /// 'NumUnits' in 'ProcResourceUnits').
uint64_t ResourceSizeMask;
// A simple round-robin selector for processor resources.
@@ -89,10 +85,9 @@ class ResourceState {
//
// NextInSequenceMask -- 0b111
//
- // Field NextInSequenceMask is used by the resource manager (i.e.
- // an object of class ResourceManager) to select the "next available resource"
- // from the set. The algorithm would prioritize resources with a bigger
- // ResourceMask value.
+ // Field NextInSequenceMask is used by class ResourceManager to select the
+ // "next available resource" from the set. The algorithm would prioritizes
+ // resources with a bigger ResourceMask value.
//
// In this example, there are three resources in the set, and 'ResourceC'
// has the highest mask value. The round-robin selector would firstly select
@@ -121,30 +116,39 @@ class ResourceState {
// removes any bits which are set in RemoveFromNextInSequence.
uint64_t RemovedFromNextInSequence;
- // A mask of ready units.
+ /// A mask of ready units.
uint64_t ReadyMask;
- // Buffered resources will have this field set to a positive number bigger
- // than 0. A buffered resource behaves like a separate reservation station
- // implementing its own buffer for out-of-order execution.
- // A buffer of 1 is for units that force in-order execution.
- // A value of 0 is treated specially. In particular, a resource with
- // A BufferSize = 0 is for an in-order issue/dispatch resource.
- // That means, this resource is reserved starting from the dispatch event,
- // until all the "resource cycles" are consumed after the issue event.
- // While this resource is reserved, no other instruction may be dispatched.
+ /// Buffered resources will have this field set to a positive number different
+ /// than zero. A buffered resource behaves like a reservation station
+ /// implementing its own buffer for out-of-order execution.
+ ///
+ /// A BufferSize of 1 is used by scheduler resources that force in-order
+ /// execution.
+ ///
+ /// A BufferSize of 0 is used to model in-order issue/dispatch resources.
+ /// Since in-order issue/dispatch resources don't implement buffers, dispatch
+ /// events coincide with issue events.
+ /// Also, no other instruction ca be dispatched/issue while this resource is
+ /// in use. Only when all the "resource cycles" are consumed (after the issue
+ /// event), a new instruction ca be dispatched.
int BufferSize;
- // Available slots in the buffer (zero, if this is not a buffered resource).
+ /// Available slots in the buffer (zero, if this is not a buffered resource).
unsigned AvailableSlots;
- // True if this is resource is currently unavailable.
- // An instruction may "reserve" a resource for a number of cycles.
- // During those cycles, the reserved resource cannot be used for other
- // instructions, even if the ReadyMask is set.
+ /// This field is set if this resource is currently reserved.
+ ///
+ /// Resources can be reserved for a number of cycles.
+ /// Instructions can still be dispatched to reserved resources. However,
+ /// istructions dispatched to a reserved resource cannot be issued to the
+ /// underlying units (i.e. pipelines) until the resource is released.
bool Unavailable;
- bool isSubResourceReady(uint64_t ID) const { return ReadyMask & ID; }
+ /// Checks for the availability of unit 'SubResMask' in the group.
+ bool isSubResourceReady(uint64_t SubResMask) const {
+ return ReadyMask & SubResMask;
+ }
/// Returns the mask identifier of the next available resource in the set.
uint64_t getNextInSequence() const {
@@ -160,25 +164,9 @@ class ResourceState {
NextInSequenceMask = ResourceSizeMask;
}
- uint64_t computeResourceSizeMaskForGroup(uint64_t ResourceMask) {
- assert(llvm::countPopulation(ResourceMask) > 1);
- return ResourceMask ^ llvm::PowerOf2Floor(ResourceMask);
- }
-
public:
ResourceState(const llvm::MCProcResourceDesc &Desc, unsigned Index,
- uint64_t Mask)
- : ProcResourceDescIndex(Index), ResourceMask(Mask) {
- bool IsAGroup = llvm::countPopulation(ResourceMask) > 1;
- ResourceSizeMask = IsAGroup ? computeResourceSizeMaskForGroup(ResourceMask)
- : ((1ULL << Desc.NumUnits) - 1);
- NextInSequenceMask = ResourceSizeMask;
- RemovedFromNextInSequence = 0;
- ReadyMask = ResourceSizeMask;
- BufferSize = Desc.BufferSize;
- AvailableSlots = BufferSize == -1 ? 0U : static_cast<unsigned>(BufferSize);
- Unavailable = false;
- }
+ uint64_t Mask);
unsigned getProcResourceID() const { return ProcResourceDescIndex; }
uint64_t getResourceMask() const { return ResourceMask; }
@@ -186,28 +174,25 @@ public:
bool isBuffered() const { return BufferSize > 0; }
bool isInOrder() const { return BufferSize == 1; }
+
+ /// Returns true if this is an in-order dispatch/issue resource.
bool isADispatchHazard() const { return BufferSize == 0; }
bool isReserved() const { return Unavailable; }
void setReserved() { Unavailable = true; }
void clearReserved() { Unavailable = false; }
- // A resource is ready if it is not reserved, and if there are enough
- // available units.
- // If a resource is also a dispatch hazard, then we don't check if
- // it is reserved because that check would always return true.
- // A resource marked as "dispatch hazard" is always reserved at
- // dispatch time. When this method is called, the assumption is that
- // the user of this resource has been already dispatched.
- bool isReady(unsigned NumUnits = 1) const {
- return (!isReserved() || isADispatchHazard()) &&
- llvm::countPopulation(ReadyMask) >= NumUnits;
- }
+ /// Returs true if this resource is not reserved, and if there are at least
+ /// `NumUnits` available units.
+ bool isReady(unsigned NumUnits = 1) const;
+
bool isAResourceGroup() const {
return llvm::countPopulation(ResourceMask) > 1;
}
- bool containsResource(uint64_t ID) const { return ResourceMask & ID; }
+ bool containsResource(uint64_t ID) const {
+ return ResourceMask & ID;
+ }
void markSubResourceAsUsed(uint64_t ID) {
assert(isSubResourceReady(ID));
@@ -226,19 +211,24 @@ public:
uint64_t selectNextInSequence();
void removeFromNextInSequence(uint64_t ID);
- ResourceStateEvent isBufferAvailable() const {
- if (isADispatchHazard() && isReserved())
- return RS_RESERVED;
- if (!isBuffered() || AvailableSlots)
- return RS_BUFFER_AVAILABLE;
- return RS_BUFFER_UNAVAILABLE;
- }
+ /// Checks if there is an available slot in the resource buffer.
+ ///
+ /// Returns RS_BUFFER_AVAILABLE if this is not a buffered resource, or if
+ /// there is a slot available.
+ ///
+ /// Returns RS_RESERVED if this buffered resource is a dispatch hazard, and it
+ /// is reserved.
+ ///
+ /// Returns RS_BUFFER_UNAVAILABLE if there are no available slots.
+ ResourceStateEvent isBufferAvailable() const;
+ /// Reserve a slot in the buffer.
void reserveBuffer() {
if (AvailableSlots)
AvailableSlots--;
}
+ /// Release a slot in the buffer.
void releaseBuffer() {
if (BufferSize > 0)
AvailableSlots++;
@@ -427,8 +417,7 @@ class Scheduler : public HardwareUnit {
public:
Scheduler(const llvm::MCSchedModel &Model, LSUnit *Lsu)
- : LSU(Lsu),
- Strategy(llvm::make_unique<DefaultSchedulerStrategy>()),
+ : LSU(Lsu), Strategy(llvm::make_unique<DefaultSchedulerStrategy>()),
Resources(llvm::make_unique<ResourceManager>(Model)) {}
Scheduler(const llvm::MCSchedModel &Model, LSUnit *Lsu,
std::unique_ptr<SchedulerStrategy> SelectStrategy)
@@ -473,7 +462,8 @@ public:
/// Issue an instruction and populates a vector of used pipeline resources,
/// and a vector of instructions that transitioned to the ready state as a
/// result of this event.
- void issueInstruction(InstRef &IR,
+ void
+ issueInstruction(InstRef &IR,
llvm::SmallVectorImpl<std::pair<ResourceRef, double>> &Used,
llvm::SmallVectorImpl<InstRef> &Ready);
More information about the llvm-commits
mailing list