arch,cpu: Add boilerplate support for matrix registers

We add initial support for matrix registers to the CPU models and add
stubs in each architecture. There are no implementations of matrix
registers added, but this provides the basic support for using them in
the future.

Jira Issue: https://gem5.atlassian.net/browse/GEM5-1289

Change-Id: I2ca6a21da932a58a801a0d08f0ad0cdca4968d02
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/64333
Maintainer: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
Sascha Bischoff
2022-08-09 09:37:47 +01:00
committed by Giacomo Travaglini
parent dd6595bf56
commit fed81f3408
24 changed files with 124 additions and 3 deletions

View File

@@ -231,10 +231,11 @@ DebugFlag('IntRegs')
DebugFlag('FloatRegs') DebugFlag('FloatRegs')
DebugFlag('VecRegs') DebugFlag('VecRegs')
DebugFlag('VecPredRegs') DebugFlag('VecPredRegs')
DebugFlag('MatRegs')
DebugFlag('CCRegs') DebugFlag('CCRegs')
DebugFlag('MiscRegs') DebugFlag('MiscRegs')
CompoundFlag('Registers', [ 'IntRegs', 'FloatRegs', 'VecRegs', 'VecPredRegs', CompoundFlag('Registers', [ 'IntRegs', 'FloatRegs', 'VecRegs', 'VecPredRegs',
'CCRegs', 'MiscRegs' ]) 'MatRegs', 'CCRegs', 'MiscRegs' ])
DebugFlag('Decoder', "Decoder debug output") DebugFlag('Decoder', "Decoder debug output")
DebugFlag('Faults', "Information about faults, exceptions, interrupts, etc") DebugFlag('Faults', "Information about faults, exceptions, interrupts, etc")

View File

@@ -54,6 +54,7 @@
#include "cpu/reg_class.hh" #include "cpu/reg_class.hh"
#include "debug/Arm.hh" #include "debug/Arm.hh"
#include "debug/LLSC.hh" #include "debug/LLSC.hh"
#include "debug/MatRegs.hh"
#include "debug/VecPredRegs.hh" #include "debug/VecPredRegs.hh"
#include "debug/VecRegs.hh" #include "debug/VecRegs.hh"
#include "dev/arm/generic_timer.hh" #include "dev/arm/generic_timer.hh"
@@ -75,6 +76,7 @@ namespace
/* Not applicable to ARM */ /* Not applicable to ARM */
RegClass floatRegClass(FloatRegClass, FloatRegClassName, 0, debug::FloatRegs); RegClass floatRegClass(FloatRegClass, FloatRegClassName, 0, debug::FloatRegs);
RegClass matRegClass(MatRegClass, MatRegClassName, 1, debug::MatRegs);
} // anonymous namespace } // anonymous namespace
@@ -86,6 +88,7 @@ ISA::ISA(const Params &p) : BaseISA(p), system(NULL),
_regClasses.push_back(&vecRegClass); _regClasses.push_back(&vecRegClass);
_regClasses.push_back(&vecElemClass); _regClasses.push_back(&vecElemClass);
_regClasses.push_back(&vecPredRegClass); _regClasses.push_back(&vecPredRegClass);
_regClasses.push_back(&matRegClass);
_regClasses.push_back(&ccRegClass); _regClasses.push_back(&ccRegClass);
_regClasses.push_back(&miscRegClass); _regClasses.push_back(&miscRegClass);

View File

@@ -38,6 +38,7 @@
#include "cpu/base.hh" #include "cpu/base.hh"
#include "cpu/reg_class.hh" #include "cpu/reg_class.hh"
#include "cpu/thread_context.hh" #include "cpu/thread_context.hh"
#include "debug/MatRegs.hh"
#include "debug/MipsPRA.hh" #include "debug/MipsPRA.hh"
#include "params/MipsISA.hh" #include "params/MipsISA.hh"
@@ -104,6 +105,7 @@ constexpr RegClass vecElemClass(VecElemClass, VecElemClassName, 2,
debug::IntRegs); debug::IntRegs);
constexpr RegClass vecPredRegClass(VecPredRegClass, VecPredRegClassName, 1, constexpr RegClass vecPredRegClass(VecPredRegClass, VecPredRegClassName, 1,
debug::IntRegs); debug::IntRegs);
constexpr RegClass matRegClass(MatRegClass, MatRegClassName, 1, debug::MatRegs);
constexpr RegClass ccRegClass(CCRegClass, CCRegClassName, 0, debug::IntRegs); constexpr RegClass ccRegClass(CCRegClass, CCRegClassName, 0, debug::IntRegs);
} // anonymous namespace } // anonymous namespace
@@ -116,6 +118,7 @@ ISA::ISA(const Params &p) : BaseISA(p), numThreads(p.num_threads),
_regClasses.push_back(&vecRegClass); _regClasses.push_back(&vecRegClass);
_regClasses.push_back(&vecElemClass); _regClasses.push_back(&vecElemClass);
_regClasses.push_back(&vecPredRegClass); _regClasses.push_back(&vecPredRegClass);
_regClasses.push_back(&matRegClass);
_regClasses.push_back(&ccRegClass); _regClasses.push_back(&ccRegClass);
_regClasses.push_back(&miscRegClass); _regClasses.push_back(&miscRegClass);

View File

@@ -41,6 +41,7 @@
#include "arch/power/regs/int.hh" #include "arch/power/regs/int.hh"
#include "arch/power/regs/misc.hh" #include "arch/power/regs/misc.hh"
#include "cpu/thread_context.hh" #include "cpu/thread_context.hh"
#include "debug/MatRegs.hh"
#include "params/PowerISA.hh" #include "params/PowerISA.hh"
namespace gem5 namespace gem5
@@ -56,6 +57,7 @@ RegClass vecRegClass(VecRegClass, VecRegClassName, 1, debug::IntRegs);
RegClass vecElemClass(VecElemClass, VecElemClassName, 2, debug::IntRegs); RegClass vecElemClass(VecElemClass, VecElemClassName, 2, debug::IntRegs);
RegClass vecPredRegClass(VecPredRegClass, VecPredRegClassName, 1, RegClass vecPredRegClass(VecPredRegClass, VecPredRegClassName, 1,
debug::IntRegs); debug::IntRegs);
RegClass matRegClass(MatRegClass, MatRegClassName, 1, debug::MatRegs);
RegClass ccRegClass(CCRegClass, CCRegClassName, 0, debug::IntRegs); RegClass ccRegClass(CCRegClass, CCRegClassName, 0, debug::IntRegs);
} // anonymous namespace } // anonymous namespace
@@ -67,6 +69,7 @@ ISA::ISA(const Params &p) : BaseISA(p)
_regClasses.push_back(&vecRegClass); _regClasses.push_back(&vecRegClass);
_regClasses.push_back(&vecElemClass); _regClasses.push_back(&vecElemClass);
_regClasses.push_back(&vecPredRegClass); _regClasses.push_back(&vecPredRegClass);
_regClasses.push_back(&matRegClass);
_regClasses.push_back(&ccRegClass); _regClasses.push_back(&ccRegClass);
_regClasses.push_back(&miscRegClass); _regClasses.push_back(&miscRegClass);
clear(); clear();

View File

@@ -48,6 +48,7 @@
#include "cpu/base.hh" #include "cpu/base.hh"
#include "debug/Checkpoint.hh" #include "debug/Checkpoint.hh"
#include "debug/LLSC.hh" #include "debug/LLSC.hh"
#include "debug/MatRegs.hh"
#include "debug/RiscvMisc.hh" #include "debug/RiscvMisc.hh"
#include "mem/packet.hh" #include "mem/packet.hh"
#include "mem/request.hh" #include "mem/request.hh"
@@ -235,6 +236,7 @@ RegClass vecRegClass(VecRegClass, VecRegClassName, 1, debug::IntRegs);
RegClass vecElemClass(VecElemClass, VecElemClassName, 2, debug::IntRegs); RegClass vecElemClass(VecElemClass, VecElemClassName, 2, debug::IntRegs);
RegClass vecPredRegClass(VecPredRegClass, VecPredRegClassName, 1, RegClass vecPredRegClass(VecPredRegClass, VecPredRegClassName, 1,
debug::IntRegs); debug::IntRegs);
RegClass matRegClass(MatRegClass, MatRegClassName, 1, debug::MatRegs);
RegClass ccRegClass(CCRegClass, CCRegClassName, 0, debug::IntRegs); RegClass ccRegClass(CCRegClass, CCRegClassName, 0, debug::IntRegs);
} // anonymous namespace } // anonymous namespace
@@ -247,6 +249,7 @@ ISA::ISA(const Params &p) :
_regClasses.push_back(&vecRegClass); _regClasses.push_back(&vecRegClass);
_regClasses.push_back(&vecElemClass); _regClasses.push_back(&vecElemClass);
_regClasses.push_back(&vecPredRegClass); _regClasses.push_back(&vecPredRegClass);
_regClasses.push_back(&matRegClass);
_regClasses.push_back(&ccRegClass); _regClasses.push_back(&ccRegClass);
_regClasses.push_back(&miscRegClass); _regClasses.push_back(&miscRegClass);

View File

@@ -39,6 +39,7 @@
#include "base/trace.hh" #include "base/trace.hh"
#include "cpu/base.hh" #include "cpu/base.hh"
#include "cpu/thread_context.hh" #include "cpu/thread_context.hh"
#include "debug/MatRegs.hh"
#include "debug/Timer.hh" #include "debug/Timer.hh"
#include "params/SparcISA.hh" #include "params/SparcISA.hh"
@@ -73,6 +74,7 @@ RegClass vecRegClass(VecRegClass, VecRegClassName, 1, debug::IntRegs);
RegClass vecElemClass(VecElemClass, VecElemClassName, 2, debug::IntRegs); RegClass vecElemClass(VecElemClass, VecElemClassName, 2, debug::IntRegs);
RegClass vecPredRegClass(VecPredRegClass, VecPredRegClassName, 1, RegClass vecPredRegClass(VecPredRegClass, VecPredRegClassName, 1,
debug::IntRegs); debug::IntRegs);
RegClass matRegClass(MatRegClass, MatRegClassName, 1, debug::MatRegs);
RegClass ccRegClass(CCRegClass, CCRegClassName, 0, debug::IntRegs); RegClass ccRegClass(CCRegClass, CCRegClassName, 0, debug::IntRegs);
} // anonymous namespace } // anonymous namespace
@@ -84,6 +86,7 @@ ISA::ISA(const Params &p) : BaseISA(p)
_regClasses.push_back(&vecRegClass); _regClasses.push_back(&vecRegClass);
_regClasses.push_back(&vecElemClass); _regClasses.push_back(&vecElemClass);
_regClasses.push_back(&vecPredRegClass); _regClasses.push_back(&vecPredRegClass);
_regClasses.push_back(&matRegClass);
_regClasses.push_back(&ccRegClass); _regClasses.push_back(&ccRegClass);
_regClasses.push_back(&miscRegClass); _regClasses.push_back(&miscRegClass);

View File

@@ -37,6 +37,7 @@
#include "base/compiler.hh" #include "base/compiler.hh"
#include "cpu/base.hh" #include "cpu/base.hh"
#include "cpu/thread_context.hh" #include "cpu/thread_context.hh"
#include "debug/MatRegs.hh"
#include "params/X86ISA.hh" #include "params/X86ISA.hh"
#include "sim/serialize.hh" #include "sim/serialize.hh"
@@ -146,6 +147,7 @@ RegClass vecRegClass(VecRegClass, VecRegClassName, 1, debug::IntRegs);
RegClass vecElemClass(VecElemClass, VecElemClassName, 2, debug::IntRegs); RegClass vecElemClass(VecElemClass, VecElemClassName, 2, debug::IntRegs);
RegClass vecPredRegClass(VecPredRegClass, VecPredRegClassName, 1, RegClass vecPredRegClass(VecPredRegClass, VecPredRegClassName, 1,
debug::IntRegs); debug::IntRegs);
RegClass matRegClass(MatRegClass, MatRegClassName, 1, debug::MatRegs);
} // anonymous namespace } // anonymous namespace
@@ -159,6 +161,7 @@ ISA::ISA(const X86ISAParams &p) : BaseISA(p), vendorString(p.vendor_string)
_regClasses.push_back(&vecRegClass); _regClasses.push_back(&vecRegClass);
_regClasses.push_back(&vecElemClass); _regClasses.push_back(&vecElemClass);
_regClasses.push_back(&vecPredRegClass); _regClasses.push_back(&vecPredRegClass);
_regClasses.push_back(&matRegClass);
_regClasses.push_back(&ccRegClass); _regClasses.push_back(&ccRegClass);
_regClasses.push_back(&miscRegClass); _regClasses.push_back(&miscRegClass);

View File

@@ -52,6 +52,7 @@ class StaticInstFlags(Enum):
"IsFloating", # References FP regs. "IsFloating", # References FP regs.
"IsVector", # References Vector regs. "IsVector", # References Vector regs.
"IsVectorElem", # References Vector reg elems. "IsVectorElem", # References Vector reg elems.
"IsMatrix", # References Matrix regs.
"IsLoad", # Reads from memory (load or prefetch). "IsLoad", # Reads from memory (load or prefetch).
"IsStore", # Writes to memory. "IsStore", # Writes to memory.
"IsAtomic", # Does atomic RMW to memory. "IsAtomic", # Does atomic RMW to memory.

View File

@@ -70,6 +70,10 @@ Scoreboard::findIndex(const RegId& reg, Index &scoreboard_index)
scoreboard_index = vecPredRegOffset + reg.index(); scoreboard_index = vecPredRegOffset + reg.index();
ret = true; ret = true;
break; break;
case MatRegClass:
scoreboard_index = matRegOffset + reg.index();
ret = true;
break;
case CCRegClass: case CCRegClass:
scoreboard_index = ccRegOffset + reg.index(); scoreboard_index = ccRegOffset + reg.index();
ret = true; ret = true;

View File

@@ -72,6 +72,7 @@ class Scoreboard : public Named
const unsigned ccRegOffset; const unsigned ccRegOffset;
const unsigned vecRegOffset; const unsigned vecRegOffset;
const unsigned vecPredRegOffset; const unsigned vecPredRegOffset;
const unsigned matRegOffset;
/** The number of registers in the Scoreboard. These /** The number of registers in the Scoreboard. These
* are just the integer, CC and float registers packed * are just the integer, CC and float registers packed
@@ -116,7 +117,9 @@ class Scoreboard : public Named
vecRegOffset(ccRegOffset + reg_classes.at(CCRegClass)->numRegs()), vecRegOffset(ccRegOffset + reg_classes.at(CCRegClass)->numRegs()),
vecPredRegOffset(vecRegOffset + vecPredRegOffset(vecRegOffset +
reg_classes.at(VecElemClass)->numRegs()), reg_classes.at(VecElemClass)->numRegs()),
numRegs(vecPredRegOffset + reg_classes.at(VecPredRegClass)->numRegs()), matRegOffset(vecPredRegOffset +
reg_classes.at(VecPredRegClass)->numRegs()),
numRegs(matRegOffset + reg_classes.at(MatRegClass)->numRegs()),
numResults(numRegs, 0), numResults(numRegs, 0),
numUnpredictableResults(numRegs, 0), numUnpredictableResults(numRegs, 0),
fuIndices(numRegs, invalidFUIndex), fuIndices(numRegs, invalidFUIndex),

View File

@@ -168,6 +168,7 @@ class BaseO3CPU(BaseCPU):
numPhysVecPredRegs = Param.Unsigned( numPhysVecPredRegs = Param.Unsigned(
32, "Number of physical predicate registers" 32, "Number of physical predicate registers"
) )
numPhysMatRegs = Param.Unsigned(2, "Number of physical matrix registers")
# most ISAs don't use condition-code regs, so default is 0 # most ISAs don't use condition-code regs, so default is 0
numPhysCCRegs = Param.Unsigned(0, "Number of physical cc registers") numPhysCCRegs = Param.Unsigned(0, "Number of physical cc registers")
numIQEntries = Param.Unsigned(64, "Number of instruction queue entries") numIQEntries = Param.Unsigned(64, "Number of instruction queue entries")

View File

@@ -90,6 +90,7 @@ CPU::CPU(const BaseO3CPUParams &params)
params.numPhysFloatRegs, params.numPhysFloatRegs,
params.numPhysVecRegs, params.numPhysVecRegs,
params.numPhysVecPredRegs, params.numPhysVecPredRegs,
params.numPhysMatRegs,
params.numPhysCCRegs, params.numPhysCCRegs,
params.isa[0]->regClasses()), params.isa[0]->regClasses()),
@@ -200,6 +201,8 @@ CPU::CPU(const BaseO3CPUParams &params)
numThreads * regClasses.at(VecRegClass)->numRegs()); numThreads * regClasses.at(VecRegClass)->numRegs());
assert(params.numPhysVecPredRegs >= assert(params.numPhysVecPredRegs >=
numThreads * regClasses.at(VecPredRegClass)->numRegs()); numThreads * regClasses.at(VecPredRegClass)->numRegs());
assert(params.numPhysMatRegs >=
numThreads * regClasses.at(MatRegClass)->numRegs());
assert(params.numPhysCCRegs >= assert(params.numPhysCCRegs >=
numThreads * regClasses.at(CCRegClass)->numRegs()); numThreads * regClasses.at(CCRegClass)->numRegs());

View File

@@ -108,6 +108,7 @@ InstructionQueue::InstructionQueue(CPU *cpu_ptr, IEW *iew_ptr,
reg_classes.at(VecElemClass)->numRegs() / reg_classes.at(VecElemClass)->numRegs() /
reg_classes.at(VecRegClass)->numRegs()) + reg_classes.at(VecRegClass)->numRegs()) +
params.numPhysVecPredRegs + params.numPhysVecPredRegs +
params.numPhysMatRegs +
params.numPhysCCRegs; params.numPhysCCRegs;
//Create an entry for each physical register within the //Create an entry for each physical register within the

View File

@@ -53,6 +53,7 @@ PhysRegFile::PhysRegFile(unsigned _numPhysicalIntRegs,
unsigned _numPhysicalFloatRegs, unsigned _numPhysicalFloatRegs,
unsigned _numPhysicalVecRegs, unsigned _numPhysicalVecRegs,
unsigned _numPhysicalVecPredRegs, unsigned _numPhysicalVecPredRegs,
unsigned _numPhysicalMatRegs,
unsigned _numPhysicalCCRegs, unsigned _numPhysicalCCRegs,
const BaseISA::RegClasses &reg_classes) const BaseISA::RegClasses &reg_classes)
: intRegFile(*reg_classes.at(IntRegClass), _numPhysicalIntRegs), : intRegFile(*reg_classes.at(IntRegClass), _numPhysicalIntRegs),
@@ -63,6 +64,7 @@ PhysRegFile::PhysRegFile(unsigned _numPhysicalIntRegs,
reg_classes.at(VecRegClass)->numRegs())), reg_classes.at(VecRegClass)->numRegs())),
vecPredRegFile(*reg_classes.at(VecPredRegClass), vecPredRegFile(*reg_classes.at(VecPredRegClass),
_numPhysicalVecPredRegs), _numPhysicalVecPredRegs),
matRegFile(*reg_classes.at(MatRegClass), _numPhysicalMatRegs),
ccRegFile(*reg_classes.at(CCRegClass), _numPhysicalCCRegs), ccRegFile(*reg_classes.at(CCRegClass), _numPhysicalCCRegs),
numPhysicalIntRegs(_numPhysicalIntRegs), numPhysicalIntRegs(_numPhysicalIntRegs),
numPhysicalFloatRegs(_numPhysicalFloatRegs), numPhysicalFloatRegs(_numPhysicalFloatRegs),
@@ -71,12 +73,14 @@ PhysRegFile::PhysRegFile(unsigned _numPhysicalIntRegs,
reg_classes.at(VecElemClass)->numRegs() / reg_classes.at(VecElemClass)->numRegs() /
reg_classes.at(VecRegClass)->numRegs())), reg_classes.at(VecRegClass)->numRegs())),
numPhysicalVecPredRegs(_numPhysicalVecPredRegs), numPhysicalVecPredRegs(_numPhysicalVecPredRegs),
numPhysicalMatRegs(_numPhysicalMatRegs),
numPhysicalCCRegs(_numPhysicalCCRegs), numPhysicalCCRegs(_numPhysicalCCRegs),
totalNumRegs(_numPhysicalIntRegs totalNumRegs(_numPhysicalIntRegs
+ _numPhysicalFloatRegs + _numPhysicalFloatRegs
+ _numPhysicalVecRegs + _numPhysicalVecRegs
+ numPhysicalVecElemRegs + numPhysicalVecElemRegs
+ _numPhysicalVecPredRegs + _numPhysicalVecPredRegs
+ _numPhysicalMatRegs
+ _numPhysicalCCRegs) + _numPhysicalCCRegs)
{ {
RegIndex phys_reg; RegIndex phys_reg;
@@ -115,6 +119,13 @@ PhysRegFile::PhysRegFile(unsigned _numPhysicalIntRegs,
flat_reg_idx++); flat_reg_idx++);
} }
// The next batch of the registers are the matrix physical
// registers; put them onto the matrix free list.
for (phys_reg = 0; phys_reg < numPhysicalMatRegs; phys_reg++) {
matRegIds.emplace_back(*reg_classes.at(MatRegClass), phys_reg,
flat_reg_idx++);
}
// The rest of the registers are the condition-code physical // The rest of the registers are the condition-code physical
// registers; put them onto the condition-code free list. // registers; put them onto the condition-code free list.
for (phys_reg = 0; phys_reg < numPhysicalCCRegs; phys_reg++) { for (phys_reg = 0; phys_reg < numPhysicalCCRegs; phys_reg++) {
@@ -167,6 +178,13 @@ PhysRegFile::initFreeList(UnifiedFreeList *freeList)
} }
freeList->addRegs(vecPredRegIds.begin(), vecPredRegIds.end()); freeList->addRegs(vecPredRegIds.begin(), vecPredRegIds.end());
/* The next batch of the registers are the matrix physical
* registers; put them onto the matrix free list. */
for (reg_idx = 0; reg_idx < numPhysicalMatRegs; reg_idx++) {
assert(matRegIds[reg_idx].index() == reg_idx);
}
freeList->addRegs(matRegIds.begin(), matRegIds.end());
// The rest of the registers are the condition-code physical // The rest of the registers are the condition-code physical
// registers; put them onto the condition-code free list. // registers; put them onto the condition-code free list.
for (reg_idx = 0; reg_idx < numPhysicalCCRegs; reg_idx++) { for (reg_idx = 0; reg_idx < numPhysicalCCRegs; reg_idx++) {

View File

@@ -91,6 +91,10 @@ class PhysRegFile
RegFile vecPredRegFile; RegFile vecPredRegFile;
std::vector<PhysRegId> vecPredRegIds; std::vector<PhysRegId> vecPredRegIds;
/** Matrix register file. */
RegFile matRegFile;
std::vector<PhysRegId> matRegIds;
/** Condition-code register file. */ /** Condition-code register file. */
RegFile ccRegFile; RegFile ccRegFile;
std::vector<PhysRegId> ccRegIds; std::vector<PhysRegId> ccRegIds;
@@ -123,6 +127,11 @@ class PhysRegFile
*/ */
unsigned numPhysicalVecPredRegs; unsigned numPhysicalVecPredRegs;
/**
* Number of physical matrix registers
*/
unsigned numPhysicalMatRegs;
/** /**
* Number of physical CC registers * Number of physical CC registers
*/ */
@@ -140,6 +149,7 @@ class PhysRegFile
unsigned _numPhysicalFloatRegs, unsigned _numPhysicalFloatRegs,
unsigned _numPhysicalVecRegs, unsigned _numPhysicalVecRegs,
unsigned _numPhysicalVecPredRegs, unsigned _numPhysicalVecPredRegs,
unsigned _numPhysicalMatRegs,
unsigned _numPhysicalCCRegs, unsigned _numPhysicalCCRegs,
const BaseISA::RegClasses &classes); const BaseISA::RegClasses &classes);
@@ -218,6 +228,11 @@ class PhysRegFile
DPRINTF(IEW, "RegFile: Access to predicate register %i, has " DPRINTF(IEW, "RegFile: Access to predicate register %i, has "
"data %s\n", idx, vecPredRegFile.regClass.valString(val)); "data %s\n", idx, vecPredRegFile.regClass.valString(val));
break; break;
case MatRegClass:
matRegFile.get(idx, val);
DPRINTF(IEW, "RegFile: Access to matrix register %i, has "
"data %s\n", idx, matRegFile.regClass.valString(val));
break;
case CCRegClass: case CCRegClass:
*(RegVal *)val = getReg(phys_reg); *(RegVal *)val = getReg(phys_reg);
break; break;
@@ -237,6 +252,8 @@ class PhysRegFile
return vectorRegFile.ptr(idx); return vectorRegFile.ptr(idx);
case VecPredRegClass: case VecPredRegClass:
return vecPredRegFile.ptr(idx); return vecPredRegFile.ptr(idx);
case MatRegClass:
return matRegFile.ptr(idx);
default: default:
panic("Unrecognized register class type %d.", type); panic("Unrecognized register class type %d.", type);
} }
@@ -302,6 +319,11 @@ class PhysRegFile
idx, vecPredRegFile.regClass.valString(val)); idx, vecPredRegFile.regClass.valString(val));
vecPredRegFile.set(idx, val); vecPredRegFile.set(idx, val);
break; break;
case MatRegClass:
DPRINTF(IEW, "RegFile: Setting matrix register %i to %s\n",
idx, matRegFile.regClass.valString(val));
matRegFile.set(idx, val);
break;
case CCRegClass: case CCRegClass:
setReg(phys_reg, *(RegVal *)val); setReg(phys_reg, *(RegVal *)val);
break; break;

View File

@@ -134,6 +134,8 @@ Rename::RenameStats::RenameStats(statistics::Group *parent)
"Number of vector rename lookups"), "Number of vector rename lookups"),
ADD_STAT(vecPredLookups, statistics::units::Count::get(), ADD_STAT(vecPredLookups, statistics::units::Count::get(),
"Number of vector predicate rename lookups"), "Number of vector predicate rename lookups"),
ADD_STAT(matLookups, statistics::units::Count::get(),
"Number of matrix rename lookups"),
ADD_STAT(committedMaps, statistics::units::Count::get(), ADD_STAT(committedMaps, statistics::units::Count::get(),
"Number of HB maps that are committed"), "Number of HB maps that are committed"),
ADD_STAT(undoneMaps, statistics::units::Count::get(), ADD_STAT(undoneMaps, statistics::units::Count::get(),
@@ -167,6 +169,7 @@ Rename::RenameStats::RenameStats(statistics::Group *parent)
fpLookups.prereq(fpLookups); fpLookups.prereq(fpLookups);
vecLookups.prereq(vecLookups); vecLookups.prereq(vecLookups);
vecPredLookups.prereq(vecPredLookups); vecPredLookups.prereq(vecPredLookups);
matLookups.prereq(matLookups);
committedMaps.prereq(committedMaps); committedMaps.prereq(committedMaps);
undoneMaps.prereq(undoneMaps); undoneMaps.prereq(undoneMaps);
@@ -1034,6 +1037,9 @@ Rename::renameSrcRegs(const DynInstPtr &inst, ThreadID tid)
case VecPredRegClass: case VecPredRegClass:
stats.vecPredLookups++; stats.vecPredLookups++;
break; break;
case MatRegClass:
stats.matLookups++;
break;
case CCRegClass: case CCRegClass:
case MiscRegClass: case MiscRegClass:
break; break;
@@ -1248,7 +1254,7 @@ Rename::readFreeEntries(ThreadID tid)
} }
DPRINTF(Rename, "[tid:%i] Free IQ: %i, Free ROB: %i, " DPRINTF(Rename, "[tid:%i] Free IQ: %i, Free ROB: %i, "
"Free LQ: %i, Free SQ: %i, FreeRM %i(%i %i %i %i %i %i)\n", "Free LQ: %i, Free SQ: %i, FreeRM %i(%i %i %i %i %i %i %i)\n",
tid, tid,
freeEntries[tid].iqEntries, freeEntries[tid].iqEntries,
freeEntries[tid].robEntries, freeEntries[tid].robEntries,
@@ -1260,6 +1266,7 @@ Rename::readFreeEntries(ThreadID tid)
renameMap[tid]->numFreeEntries(VecRegClass), renameMap[tid]->numFreeEntries(VecRegClass),
renameMap[tid]->numFreeEntries(VecElemClass), renameMap[tid]->numFreeEntries(VecElemClass),
renameMap[tid]->numFreeEntries(VecPredRegClass), renameMap[tid]->numFreeEntries(VecPredRegClass),
renameMap[tid]->numFreeEntries(MatRegClass),
renameMap[tid]->numFreeEntries(CCRegClass)); renameMap[tid]->numFreeEntries(CCRegClass));
DPRINTF(Rename, "[tid:%i] %i instructions not yet in ROB\n", DPRINTF(Rename, "[tid:%i] %i instructions not yet in ROB\n",

View File

@@ -521,6 +521,7 @@ class Rename
statistics::Scalar fpLookups; statistics::Scalar fpLookups;
statistics::Scalar vecLookups; statistics::Scalar vecLookups;
statistics::Scalar vecPredLookups; statistics::Scalar vecPredLookups;
statistics::Scalar matLookups;
/** Stat for total number of committed renaming mappings. */ /** Stat for total number of committed renaming mappings. */
statistics::Scalar committedMaps; statistics::Scalar committedMaps;
/** Stat for total number of mappings that were undone due to a /** Stat for total number of mappings that were undone due to a

View File

@@ -64,6 +64,7 @@ enum RegClassType
/** Vector Register Native Elem lane. */ /** Vector Register Native Elem lane. */
VecElemClass, VecElemClass,
VecPredRegClass, VecPredRegClass,
MatRegClass, ///< Matrix Register
CCRegClass, ///< Condition-code register CCRegClass, ///< Condition-code register
MiscRegClass, ///< Control (misc) register MiscRegClass, ///< Control (misc) register
InvalidRegClass = -1 InvalidRegClass = -1
@@ -75,6 +76,7 @@ inline constexpr char FloatRegClassName[] = "floating_point";
inline constexpr char VecRegClassName[] = "vector"; inline constexpr char VecRegClassName[] = "vector";
inline constexpr char VecElemClassName[] = "vector_element"; inline constexpr char VecElemClassName[] = "vector_element";
inline constexpr char VecPredRegClassName[] = "vector_predicate"; inline constexpr char VecPredRegClassName[] = "vector_predicate";
inline constexpr char MatRegClassName[] = "matrix";
inline constexpr char CCRegClassName[] = "condition_code"; inline constexpr char CCRegClassName[] = "condition_code";
inline constexpr char MiscRegClassName[] = "miscellaneous"; inline constexpr char MiscRegClassName[] = "miscellaneous";

View File

@@ -418,6 +418,12 @@ BaseSimpleCPU::postExecute()
t_info.execContextStats.numVecInsts++; t_info.execContextStats.numVecInsts++;
} }
//Matrix alu accesses
if (curStaticInst->isMatrix()){
t_info.execContextStats.numMatAluAccesses++;
t_info.execContextStats.numMatInsts++;
}
//number of function calls/returns to get window accesses //number of function calls/returns to get window accesses
if (curStaticInst->isCall() || curStaticInst->isReturn()){ if (curStaticInst->isCall() || curStaticInst->isReturn()){
t_info.execContextStats.numCallsReturns++; t_info.execContextStats.numCallsReturns++;

View File

@@ -96,6 +96,8 @@ class SimpleExecContext : public ExecContext
"Number of float alu accesses"), "Number of float alu accesses"),
ADD_STAT(numVecAluAccesses, statistics::units::Count::get(), ADD_STAT(numVecAluAccesses, statistics::units::Count::get(),
"Number of vector alu accesses"), "Number of vector alu accesses"),
ADD_STAT(numMatAluAccesses, statistics::units::Count::get(),
"Number of matrix alu accesses"),
ADD_STAT(numCallsReturns, statistics::units::Count::get(), ADD_STAT(numCallsReturns, statistics::units::Count::get(),
"Number of times a function call or return occured"), "Number of times a function call or return occured"),
ADD_STAT(numCondCtrlInsts, statistics::units::Count::get(), ADD_STAT(numCondCtrlInsts, statistics::units::Count::get(),
@@ -106,6 +108,8 @@ class SimpleExecContext : public ExecContext
"Number of float instructions"), "Number of float instructions"),
ADD_STAT(numVecInsts, statistics::units::Count::get(), ADD_STAT(numVecInsts, statistics::units::Count::get(),
"Number of vector instructions"), "Number of vector instructions"),
ADD_STAT(numMatInsts, statistics::units::Count::get(),
"Number of matrix instructions"),
ADD_STAT(numIntRegReads, statistics::units::Count::get(), ADD_STAT(numIntRegReads, statistics::units::Count::get(),
"Number of times the integer registers were read"), "Number of times the integer registers were read"),
ADD_STAT(numIntRegWrites, statistics::units::Count::get(), ADD_STAT(numIntRegWrites, statistics::units::Count::get(),
@@ -162,6 +166,7 @@ class SimpleExecContext : public ExecContext
&numVecRegReads, &numVecRegReads,
&numVecRegReads, &numVecRegReads,
&numVecPredRegReads, &numVecPredRegReads,
&numMatRegReads,
&numCCRegReads &numCCRegReads
}, },
numRegWrites{ numRegWrites{
@@ -170,6 +175,7 @@ class SimpleExecContext : public ExecContext
&numVecRegWrites, &numVecRegWrites,
&numVecRegWrites, &numVecRegWrites,
&numVecPredRegWrites, &numVecPredRegWrites,
&numMatRegWrites,
&numCCRegWrites &numCCRegWrites
} }
{ {
@@ -220,6 +226,9 @@ class SimpleExecContext : public ExecContext
// Number of vector alu accesses // Number of vector alu accesses
statistics::Scalar numVecAluAccesses; statistics::Scalar numVecAluAccesses;
// Number of matrix alu accesses
statistics::Scalar numMatAluAccesses;
// Number of function calls/returns // Number of function calls/returns
statistics::Scalar numCallsReturns; statistics::Scalar numCallsReturns;
@@ -235,6 +244,9 @@ class SimpleExecContext : public ExecContext
// Number of vector instructions // Number of vector instructions
statistics::Scalar numVecInsts; statistics::Scalar numVecInsts;
// Number of matrix instructions
statistics::Scalar numMatInsts;
// Number of integer register file accesses // Number of integer register file accesses
statistics::Scalar numIntRegReads; statistics::Scalar numIntRegReads;
statistics::Scalar numIntRegWrites; statistics::Scalar numIntRegWrites;
@@ -251,6 +263,10 @@ class SimpleExecContext : public ExecContext
mutable statistics::Scalar numVecPredRegReads; mutable statistics::Scalar numVecPredRegReads;
statistics::Scalar numVecPredRegWrites; statistics::Scalar numVecPredRegWrites;
// Number of matrix register file accesses
mutable statistics::Scalar numMatRegReads;
statistics::Scalar numMatRegWrites;
// Number of condition code register file accesses // Number of condition code register file accesses
statistics::Scalar numCCRegReads; statistics::Scalar numCCRegReads;
statistics::Scalar numCCRegWrites; statistics::Scalar numCCRegWrites;

View File

@@ -75,6 +75,7 @@ SimpleThread::SimpleThread(BaseCPU *_cpu, int _thread_num, System *_sys,
{*_isa->regClasses().at(VecRegClass)}, {*_isa->regClasses().at(VecRegClass)},
{*_isa->regClasses().at(VecElemClass)}, {*_isa->regClasses().at(VecElemClass)},
{*_isa->regClasses().at(VecPredRegClass)}, {*_isa->regClasses().at(VecPredRegClass)},
{*_isa->regClasses().at(MatRegClass)},
{*_isa->regClasses().at(CCRegClass)} {*_isa->regClasses().at(CCRegClass)}
}}, }},
isa(_isa), isa(_isa),

View File

@@ -57,6 +57,7 @@
#include "debug/CCRegs.hh" #include "debug/CCRegs.hh"
#include "debug/FloatRegs.hh" #include "debug/FloatRegs.hh"
#include "debug/IntRegs.hh" #include "debug/IntRegs.hh"
#include "debug/MatRegs.hh"
#include "debug/VecPredRegs.hh" #include "debug/VecPredRegs.hh"
#include "debug/VecRegs.hh" #include "debug/VecRegs.hh"
#include "mem/htm.hh" #include "mem/htm.hh"

View File

@@ -155,6 +155,7 @@ class StaticInst : public RefCounted, public StaticInstFlags
bool isInteger() const { return flags[IsInteger]; } bool isInteger() const { return flags[IsInteger]; }
bool isFloating() const { return flags[IsFloating]; } bool isFloating() const { return flags[IsFloating]; }
bool isVector() const { return flags[IsVector]; } bool isVector() const { return flags[IsVector]; }
bool isMatrix() const { return flags[IsMatrix]; }
bool isControl() const { return flags[IsControl]; } bool isControl() const { return flags[IsControl]; }
bool isCall() const { return flags[IsCall]; } bool isCall() const { return flags[IsCall]; }

View File

@@ -109,6 +109,20 @@ ThreadContext::compare(ThreadContext *one, ThreadContext *two)
} }
} }
// Then loop through the matrix registers.
const auto *mat_class = regClasses.at(MatRegClass);
std::vector<uint8_t> mat1(mat_class->regBytes());
std::vector<uint8_t> mat2(mat_class->regBytes());
for (auto &id: *regClasses.at(MatRegClass)) {
one->getReg(id, mat1.data());
two->getReg(id, mat2.data());
if (mat1 != mat2) {
panic("Mat reg idx %d doesn't match, one: %#x, two: %#x",
id.index(), mat_class->valString(mat1.data()),
mat_class->valString(mat2.data()));
}
}
for (int i = 0; i < regClasses.at(MiscRegClass)->numRegs(); ++i) { for (int i = 0; i < regClasses.at(MiscRegClass)->numRegs(); ++i) {
RegVal t1 = one->readMiscRegNoEffect(i); RegVal t1 = one->readMiscRegNoEffect(i);
RegVal t2 = two->readMiscRegNoEffect(i); RegVal t2 = two->readMiscRegNoEffect(i);