2017-04-22 11 views
0

minstret未満である:測定mcycleは、私が「riscv-テスト/ビルド/ベンチマーク/ riscv-ツール」でテストプログラムを実行するためにスパイクを使用するスパイク

$ spike multiply.riscv 

と出力ショー:

mcycle = 24096 
minstret = 24103 

なぜmcycleminstret未満ですか?

用量スパイクは1サイクルで複数の命令を実行できますか?
(スパイクコードをトレースしようとしましたが、mcycleのカウント方法は見つかりませんでした)

+0

これは正常です。ベンチマークでは、単一命令ではなく、隣接命令ではなく、読み込み間に少量のサポートコードがあります(約6-7命令)。 – osgx

答えて

1

mcycleとminstret値の印刷は、この場合Spikeのものではなく、テスト(ベンチマーク)からのものです。コードはあり:

https://github.com/ucb-bar/riscv-benchmarks/blob/master/common/syscalls.c

#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; 
} 

読み取りmcycle & minstretの間にいくつかのコードがあります。そして今、あなたは読書の間にどれくらいのコードがあるか知っています。スパイクmcycle & minstretで

は(それらが同じコードにより処理される)定義によって常に等しい:https://github.com/riscv/riscv-isa-sim/blob/9e012462f53113dc9ed00d7fbb89aeafeb9b89e9/riscv/processor.cc#L347

case CSR_MINSTRET: 
    case CSR_MCYCLE: 
     if (xlen == 32) 
     state.minstret = (state.minstret >> 32 << 32) | (val & 0xffffffffU); 
     else 
     state.minstret = val; 
     break; 

syscalls.cはhttps://github.com/ucb-bar/riscv-benchmarks/blob/master/multiply/bmark.mkからmultiply.riscvバイナリにリンクされた - 乗算multiply_riscv_bin =。 riscv $(multiply_riscv_bin):... $(patsubst%.cファイル、%.oの、... syscalls.c ...)

_initは、テストのmainを呼び出すsyscalls.c機能であるとSYS_statsに記録された値を出力する "syスコット "handle_stats

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); 
} 
関連する問題