Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Riscv 在扣球方面,测得的麦凯轮比吟游诗人少_Riscv - Fatal编程技术网

Riscv 在扣球方面,测得的麦凯轮比吟游诗人少

Riscv 在扣球方面,测得的麦凯轮比吟游诗人少,riscv,Riscv,我使用spike运行“riscv工具/riscv测试/构建/基准”中的测试程序: 输出结果显示: mcycle = 24096 minstret = 24103 为什么mcycle小于minstret 这是否意味着spike可以在一个周期内运行多条指令? (我试图跟踪spike代码,但找不到McCycle是如何计数的。)McCycle和minstret值的打印不是来自spike,而是来自测试(基准测试)。代码如下: 在阅读《麦基乐》和《吟游诗人》之间有一些代码。现在你知道读数之间有多少代码了

我使用spike运行“riscv工具/riscv测试/构建/基准”中的测试程序:

输出结果显示:

mcycle = 24096
minstret = 24103
为什么
mcycle
小于
minstret

这是否意味着spike可以在一个周期内运行多条指令?

(我试图跟踪spike代码,但找不到McCycle是如何计数的。)

McCycle和minstret值的打印不是来自spike,而是来自测试(基准测试)。代码如下:

在阅读《麦基乐》和《吟游诗人》之间有一些代码。现在你知道读数之间有多少代码了

在Spike中,McCycle和吟游诗人在定义上总是平等的(他们由相同的代码处理):


这是正常的,基准测试只读取mcycles和minstret,不在单个指令中,也不在相邻指令中,读取之间有少量支持代码,大约6-7条指令。
mcycle = 24096
minstret = 24103
#define NUM_COUNTERS 2
static uintptr_t counters[NUM_COUNTERS];
static char* counter_names[NUM_COUNTERS];

static int handle_stats(int enable)
{
  int i = 0;
#define READ_CTR(name) do { \
    while (i >= NUM_COUNTERS) ; \
    uintptr_t csr = read_csr(name); \
    if (!enable) { csr -= counters[i]; counter_names[i] = #name; } \
    counters[i++] = csr; \
  } while (0)

  READ_CTR(mcycle);
  READ_CTR(minstret);

#undef READ_CTR
  return 0;
}
    case CSR_MINSTRET:
    case CSR_MCYCLE:
      if (xlen == 32)
        state.minstret = (state.minstret >> 32 << 32) | (val & 0xffffffffU);
      else
        state.minstret = val;
      break;
void _init(int cid, int nc)
{
  init_tls();
  thread_entry(cid, nc);

  // only single-threaded programs should ever get here.
  int ret = main(0, 0);

  char buf[NUM_COUNTERS * 32] __attribute__((aligned(64)));
  char* pbuf = buf;
  for (int i = 0; i < NUM_COUNTERS; i++)
    if (counters[i])
      pbuf += sprintf(pbuf, "%s = %d\n", counter_names[i], counters[i]);
  if (pbuf != buf)
    printstr(buf);

  exit(ret);
}