| //===--------------------- Support.h ----------------------------*- C++ -*-===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| /// \file | |
| /// | |
| /// Helper functions used by various pipeline components. | |
| /// | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_TOOLS_LLVM_MCA_SUPPORT_H | |
| #define LLVM_TOOLS_LLVM_MCA_SUPPORT_H | |
| #include "llvm/ADT/ArrayRef.h" | |
| #include "llvm/ADT/SmallVector.h" | |
| #include "llvm/MC/MCSchedule.h" | |
| namespace mca { | |
| /// Populates vector Masks with processor resource masks. | |
| /// | |
| /// The number of bits set in a mask depends on the processor resource type. | |
| /// Each processor resource mask has at least one bit set. For groups, the | |
| /// number of bits set in the mask is equal to the cardinality of the group plus | |
| /// one. Excluding the most significant bit, the remaining bits in the mask | |
| /// identify processor resources that are part of the group. | |
| /// | |
| /// Example: | |
| /// | |
| /// ResourceA -- Mask: 0b001 | |
| /// ResourceB -- Mask: 0b010 | |
| /// ResourceAB -- Mask: 0b100 U (ResourceA::Mask | ResourceB::Mask) == 0b111 | |
| /// | |
| /// ResourceAB is a processor resource group containing ResourceA and ResourceB. | |
| /// Each resource mask uniquely identifies a resource; both ResourceA and | |
| /// ResourceB only have one bit set. | |
| /// ResourceAB is a group; excluding the most significant bit in the mask, the | |
| /// remaining bits identify the composition of the group. | |
| /// | |
| /// Resource masks are used by the ResourceManager to solve set membership | |
| /// problems with simple bit manipulation operations. | |
| void computeProcResourceMasks(const llvm::MCSchedModel &SM, | |
| llvm::SmallVectorImpl<uint64_t> &Masks); | |
| /// Compute the reciprocal block throughput from a set of processor resource | |
| /// cycles. The reciprocal block throughput is computed as the MAX between: | |
| /// - NumMicroOps / DispatchWidth | |
| /// - ProcResourceCycles / #ProcResourceUnits (for every consumed resource). | |
| double computeBlockRThroughput(const llvm::MCSchedModel &SM, | |
| unsigned DispatchWidth, unsigned NumMicroOps, | |
| llvm::ArrayRef<unsigned> ProcResourceUsage); | |
| } // namespace mca | |
| #endif |