From f0eea4a392c7c54fb8763b5d58d0e91b10faed6f Mon Sep 17 00:00:00 2001 From: Luke D'Alessandro Date: Fri, 28 Jun 2024 20:57:04 +0000 Subject: [PATCH] [vanadis] Implement the missing Zicntr instructions. Chapter 8 in https://github.com/riscv/riscv-isa-manual/releases/download/riscv-isa-release-f797123-2024-06-27/riscv-unprivileged.pdf details the RISC-V counter interface. There are 3 bespoke counters detailed in the Zicntr extensions in 8.1, and up to 29 more user-programmable counters detailed in the Zihpm extenstion in 8.2. This commit provides space for all 32 counters in the register file, but only currently implements the three Zicntr counters. The implementation consists of a few changes. 1. I have extended the register file structure with 32, 64 bit counters, and `increment` and `get` members in order to update and read those counters. 2. I have added a new instruction, `Zicntr::VanadisReadCounterInstruction` in order to read those counters. This instruction can be tailored for any of the 3 `Zicntr`s (implemented as tag types in `inst/zicntr.h`), XLEN=64 or 32, and with or without the `[H]` extension. 3. I have added decoding to `decoder/vriscv64decoder.h` to handle `RDCYCLE`, `RDTIME`, and `RDINSTRET`. Because the `[H]` and XLEN=32 versions are only available in `riscv32`, the `riscv64` decoder simply injects a decoding failure if those occur. 4. I have extended the core's `tick` to update the three `Zicntr`s. 5. I have added a small misc test example to demonstrate usage. I have not implemented any functionality for programming the 29 `Zihpm` counters, nor have I added any special decoding to read these registers. I have decided that the `Zicntr` instructions will be processed by the arithmetic functional unit. I don't know if this is appropriate, but it should manage any register port contention properly and seemed like the most expedient solution. I have removed the `cycle_count` and the `getCycleCount` from the decoder base class, as it is no longer being used. The current cycle is still passed to the decoder `tick()` even though it is _also_ still unused. --- src/sst/elements/vanadis/decoder/vdecoder.h | 2 - .../elements/vanadis/decoder/vmipsdecoder.h | 4 +- .../vanadis/decoder/vriscv64decoder.h | 33 ++++--- src/sst/elements/vanadis/inst/regfile.h | 16 +++ src/sst/elements/vanadis/inst/vinstall.h | 4 + src/sst/elements/vanadis/inst/vzicntr.h | 17 ++++ .../vanadis/inst/vzicntr_readcounter.h | 91 ++++++++++++++++++ .../elements/vanadis/sst-vanadis-tracediff | Bin 0 -> 86176 bytes .../elements/vanadis/tests/basic_vanadis.py | 1 + .../tests/small/misc/zicntr/riscv64/zicntr | Bin 0 -> 89400 bytes .../vanadis/tests/small/misc/zicntr/zicntr.c | 29 ++++++ src/sst/elements/vanadis/vanadis.cc | 12 ++- 12 files changed, 192 insertions(+), 17 deletions(-) create mode 100644 src/sst/elements/vanadis/inst/vzicntr.h create mode 100644 src/sst/elements/vanadis/inst/vzicntr_readcounter.h create mode 100755 src/sst/elements/vanadis/sst-vanadis-tracediff create mode 100755 src/sst/elements/vanadis/tests/small/misc/zicntr/riscv64/zicntr create mode 100644 src/sst/elements/vanadis/tests/small/misc/zicntr/zicntr.c diff --git a/src/sst/elements/vanadis/decoder/vdecoder.h b/src/sst/elements/vanadis/decoder/vdecoder.h index e88228b3f3..eef5e3a0c6 100644 --- a/src/sst/elements/vanadis/decoder/vdecoder.h +++ b/src/sst/elements/vanadis/decoder/vdecoder.h @@ -215,7 +215,6 @@ class VanadisDecoder : public SST::SubComponent void setThreadLocalStoragePointer(uint64_t new_tls) { tls_ptr = new_tls; } uint64_t getThreadLocalStoragePointer() const { return tls_ptr; } - uint64_t getCycleCount() const { return cycle_count; } // VanadisCircularQueue* getDecodedQueue() { return // decoded_q; } @@ -242,7 +241,6 @@ class VanadisDecoder : public SST::SubComponent uint32_t core; uint64_t tls_ptr; - uint64_t cycle_count; bool wantDelegatedLoad; VanadisCircularQueue* thread_rob; diff --git a/src/sst/elements/vanadis/decoder/vmipsdecoder.h b/src/sst/elements/vanadis/decoder/vmipsdecoder.h index 749e6608e5..c092844aa2 100644 --- a/src/sst/elements/vanadis/decoder/vmipsdecoder.h +++ b/src/sst/elements/vanadis/decoder/vmipsdecoder.h @@ -430,13 +430,11 @@ class VanadisMIPSDecoder : public VanadisDecoder stat_decode_cop1_eq = registerStatistic("ins_decode_cop1_eq", "1"); } - virtual void tick(SST::Output* output, uint64_t cycle) + virtual void tick(SST::Output* output, uint64_t) { output->verbose(CALL_INFO, 16, VANADIS_DBG_DECODER_FLG, "-> Decode step for thr: %" PRIu32 "\n", hw_thr); output->verbose(CALL_INFO, 16, VANADIS_DBG_DECODER_FLG, "---> Max decodes per cycle: %" PRIu16 "\n", max_decodes_per_cycle); - cycle_count = cycle; - ins_loader->printStatus(output); uint16_t decodes_performed = 0; diff --git a/src/sst/elements/vanadis/decoder/vriscv64decoder.h b/src/sst/elements/vanadis/decoder/vriscv64decoder.h index 670bb2a5ef..458391c56a 100644 --- a/src/sst/elements/vanadis/decoder/vriscv64decoder.h +++ b/src/sst/elements/vanadis/decoder/vriscv64decoder.h @@ -128,15 +128,13 @@ class VanadisRISCV64Decoder : public VanadisDecoder } - void tick(SST::Output* output, uint64_t cycle) override + void tick(SST::Output* output, uint64_t) override { if(output->getVerboseLevel() >= 16) { output->verbose(CALL_INFO, 16, 0, "-> Decode step for thr: %" PRIu32 "\n", hw_thr); output->verbose(CALL_INFO, 16, 0, "---> Max decodes per cycle: %" PRIu16 "\n", max_decodes_per_cycle); } - cycle_count = cycle; - for ( uint16_t i = 0; i < max_decodes_per_cycle; ++i ) { if ( ! thread_rob->full() ) { if ( ins_loader->hasBundleAt(ip) ) { @@ -1107,16 +1105,29 @@ class VanadisRISCV64Decoder : public VanadisDecoder } break; default: { + using namespace Zicntr; uint64_t csrNum = uimm64 & 0xfff; switch ( csrNum ) { - case 0xc00: - { - if ( 0 == rs1 ) { - auto thread_call = std::bind(&VanadisRISCV64Decoder::getCycleCount, this); - bundle->addInstruction( new VanadisSetRegisterByCallInstruction( ins_address, hw_thr, options, rd, thread_call)); - decode_fault = false; - } - } break; + case 0xc00: // RDCYCLE + bundle->addInstruction( new VanadisReadCounterInstruction( CYCLE, ins_address, hw_thr, options, rd ) ); + decode_fault = 0 != rs1; + break; + + case 0xc01: // RDTIME + bundle->addInstruction( new VanadisReadCounterInstruction( TIME, ins_address, hw_thr, options, rd ) ); + decode_fault = 0 != rs1; + break; + + case 0xc02: // RDINSTRET + bundle->addInstruction( new VanadisReadCounterInstruction( INSTRET, ins_address, hw_thr, options, rd ) ); + decode_fault = 0 != rs1; + break; + + case 0xc80: // RDCYCLEH + case 0xc81: // RDTIMEH + case 0xc82: // RDINSTRETH + output->verbose( CALL_INFO, 16, 0, "riscv64 does not support Zicntr [H] suffix" ); + break; } } break; diff --git a/src/sst/elements/vanadis/inst/regfile.h b/src/sst/elements/vanadis/inst/regfile.h index dc69dced9c..9a945dee02 100644 --- a/src/sst/elements/vanadis/inst/regfile.h +++ b/src/sst/elements/vanadis/inst/regfile.h @@ -52,6 +52,7 @@ class VanadisRegisterFile void init( ) { std::memset(int_reg_storage, 0, (int_reg_width * count_int_regs)); std::memset(fp_reg_storage, 0, (fp_reg_width * count_fp_regs)); + std::fill_n(counters, sizeof(counters), 0); } ~VanadisRegisterFile() @@ -212,6 +213,18 @@ class VanadisRegisterFile } } + void incrementCounter(int i, uint64_t n = 1) + { + assert(0 <= i and i < sizeof(counters)); + counters[i] += n; + } + + uint64_t getCounter(int i) const + { + assert(0 <= i and i < sizeof(counters)); + return counters[i]; + } + private: char* getIntReg(const uint16_t reg) { @@ -263,6 +276,9 @@ class VanadisRegisterFile VanadisFPRegisterMode fp_reg_mode; const uint32_t fp_reg_width; const uint32_t int_reg_width; + + // Counters from 8 https://github.com/riscv/riscv-isa-manual/releases/download/riscv-isa-release-f797123-2024-06-27/riscv-unprivileged.pdf + uint64_t counters[32]; }; } // namespace Vanadis diff --git a/src/sst/elements/vanadis/inst/vinstall.h b/src/sst/elements/vanadis/inst/vinstall.h index 736f5385c4..122816233f 100644 --- a/src/sst/elements/vanadis/inst/vinstall.h +++ b/src/sst/elements/vanadis/inst/vinstall.h @@ -120,4 +120,8 @@ #include "inst/vfpclass.h" #include "inst/vmin.h" +// Zicntr +#include "inst/vzicntr.h" +#include "inst/vzicntr_readcounter.h" + #endif diff --git a/src/sst/elements/vanadis/inst/vzicntr.h b/src/sst/elements/vanadis/inst/vzicntr.h new file mode 100644 index 0000000000..1f76a3a756 --- /dev/null +++ b/src/sst/elements/vanadis/inst/vzicntr.h @@ -0,0 +1,17 @@ + +#ifndef _H_VANADIS_ZICNTR +#define _H_VANADIS_ZICNTR + +#include + +namespace SST::Vanadis +{ + // Tags to be used to with the regfile and VanadisReadCounterInstruction + namespace Zicntr { + inline constexpr std::integral_constant CYCLE; + inline constexpr std::integral_constant TIME; + inline constexpr std::integral_constant INSTRET; + } +} // namespace Vanadis::SST + +#endif diff --git a/src/sst/elements/vanadis/inst/vzicntr_readcounter.h b/src/sst/elements/vanadis/inst/vzicntr_readcounter.h new file mode 100644 index 0000000000..d20b1ab66d --- /dev/null +++ b/src/sst/elements/vanadis/inst/vzicntr_readcounter.h @@ -0,0 +1,91 @@ + +#ifndef _H_VANADIS_ZICNTR_READ_COUNTER +#define _H_VANADIS_ZICNTR_READ_COUNTER + +#include "inst/vinst.h" +#include "inst/vzicntr.h" + +namespace SST::Vanadis +{ + namespace Zicntr + { + template + class VanadisReadCounterInstruction : public VanadisInstruction + { + static_assert( id < 3 ); + static_assert( XLEN == 64 or XLEN == 32 ); + static_assert( XLEN != 64 or H == false ); + + public: + VanadisReadCounterInstruction( + const std::integral_constant, + const uint64_t addr, + const uint32_t hw_thr, + const VanadisDecoderOptions* isa_opts, + const uint16_t dest) + : VanadisInstruction(addr, hw_thr, isa_opts, 0, 1, 0, 1, 0, 0, 0, 0) + { + isa_int_regs_out[0] = dest; + } + + VanadisReadCounterInstruction* clone() override + { + return new VanadisReadCounterInstruction(*this); + } + + VanadisFunctionalUnitType getInstFuncType() const override + { + return INST_INT_ARITH; // Is this appropriate? + } + + const char* getInstCode() const override + { + switch ( id ) { + case Zicntr::CYCLE: return H ? "RDCYCLEH" : "RDCYCLE"; + case Zicntr::TIME: return H ? "RDTIMEH" : "RDTIME"; + case Zicntr::INSTRET: return H ? "RDINSTRETH" : "RDINSTRET"; + } + __builtin_unreachable(); + } + + void printToBuffer(char* const buffer, const size_t buffer_size) override + { + snprintf( + buffer, buffer_size, + "%s %5" PRIu16 " (phys: %5" PRIu16 ")", + getInstCode(), isa_int_regs_out[0], phys_int_regs_out[0]); + } + + void execute(SST::Output* const output, VanadisRegisterFile* const regFile) override + { +#ifdef VANADIS_BUILD_DEBUG + if(output->getVerboseLevel() >= 16) { + output->verbose( + CALL_INFO, 16, 0, + "Execute: 0x%" PRI_ADDR " %s phys: out=%" PRIu16 ", isa: out=%" PRIu16 "\n", + getInstructionAddress(), getInstCode(), phys_int_regs_out[0], isa_int_regs_out[0]); + } +#endif + + static constexpr uint64_t mask = 0x00000000'FFFFFFFF; + const uint64_t count64 = regFile->getCounter(id); + const uint32_t count32 = count64 & mask; + const uint32_t count32H = count64 >> 32; + + if constexpr ( XLEN == 64 ) { + regFile->setIntReg(phys_int_regs_out[0], count64); + } + else if constexpr ( XLEN == 32 and H ) { + regFile->setIntReg(phys_int_regs_out[0], count32H); + } + else { + regFile->setIntReg(phys_int_regs_out[0], count32); + } + + markExecuted(); + } + }; + } // namespace Zicntr +} // namespace Vanadis::SST + +#endif diff --git a/src/sst/elements/vanadis/sst-vanadis-tracediff b/src/sst/elements/vanadis/sst-vanadis-tracediff new file mode 100755 index 0000000000000000000000000000000000000000..911b2b574478c6f80df10e7ef0a7b3341d654609 GIT binary patch literal 86176 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

f^FN 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 literal 0 HcmV?d00001 diff --git a/src/sst/elements/vanadis/tests/small/misc/zicntr/zicntr.c b/src/sst/elements/vanadis/tests/small/misc/zicntr/zicntr.c new file mode 100644 index 0000000000..699d821d50 --- /dev/null +++ b/src/sst/elements/vanadis/tests/small/misc/zicntr/zicntr.c @@ -0,0 +1,29 @@ +#include +#include +#include + +uint64_t read_cycles() { + uint64_t cycles; + asm volatile ("rdcycle %0" : "=r" (cycles)); + return cycles; +} + +uint64_t read_time() { + uint64_t time; + asm volatile ("rdtime %0" : "=r" (time)); + return time; +} + +uint64_t read_instructions() { + uint64_t instructions; + asm volatile ("rdinstret %0" : "=r" (instructions)); + return instructions; +} + +int main() +{ + uint64_t cycles = read_cycles(); + uint64_t time = read_time(); + uint64_t instructions = read_instructions(); + printf("cycles: %" PRIu64 " time: %" PRIu64 " instructions: %" PRIu64 "\n", cycles, time, instructions); +} diff --git a/src/sst/elements/vanadis/vanadis.cc b/src/sst/elements/vanadis/vanadis.cc index 7e970d33e3..8c0ea02cab 100644 --- a/src/sst/elements/vanadis/vanadis.cc +++ b/src/sst/elements/vanadis/vanadis.cc @@ -959,6 +959,11 @@ VANADIS_COMPONENT::performRetire(int rob_num, VanadisCircularQueueincrementCounter(Zicntr::INSTRET); + if ( perform_delay_cleanup ) { VanadisInstruction* delay_ins = rob->pop(); @@ -1299,7 +1304,7 @@ VANADIS_COMPONENT::tick(SST::Cycle_t cycle) if ( cnt ) { auto thr = m_curRetireHwThread; rc[thr] = performRetire(thr, rob[thr], cycle); - + ++m_curRetireHwThread; m_curRetireHwThread %= hw_threads; cnt = hw_threads; @@ -1417,6 +1422,11 @@ VANADIS_COMPONENT::tick(SST::Cycle_t cycle) #endif current_cycle++; + for (VanadisRegisterFile* reg : register_files) { + assert(reg); + reg->incrementCounter(Zicntr::CYCLE); + reg->incrementCounter(Zicntr::TIME); + } uint64_t used_phys_int = 0; uint64_t used_phys_fp = 0;