サイクル精度シミュレータのSniperは、CPUをモデル化して性能を見積もることができるシミュレータが、深く探っているといろいろと問題が出てくる。
例えば、モデルの制限上同一キャッシュラインへのアクセスについて、ヒット・ミスの履歴が正確に表示されない問題がある:
以下のようなベクトルメモリアクセス命令を考える:
size_t vl = __riscv_vsetvlmax_e64m1(); vuint64m1_t mem0 = __riscv_vle64_v_u64m1 (&mem_area[0], vl); vuint64m1_t mem1 = __riscv_vle64_v_u64m1 (&mem_area[1], vl);
同一キャッシュラインへのアクセスで、最初の命令mem0がキャッシュミスし、DRAMにアクセスを行う。 そうすると、mem1の命令においてはアウト・オブ・オーダCPUにおいて想定としては同様にキャッシュミスが発生し、MSHRに格納されているリクエストがヒットすることで同様に待ち状態に入ると思われる。
この時、mem1の命令はキャッシュにヒットしたのか、ミスしたのかどう考えるのか、という問題だが、直観的にはmem0と同様にL1ミスが発生しDRAMにヒットしたと考えるのが自然だと思われる。
しかし、モデルとしてはmem0がキャッシュミスを発生し、そのレイテンシを計算することでL1にキャッシュラインが格納され、mem1がヒットしたように見える。
[ 0] 1 N DONE@+340 32 LOAD F1011c: vle64.v v24, (a3) {0x18c58} (dram, 338)
[ 1] N DONE@+311 33 LOAD L1011c: vle64.v v24, (a3) {0x18c80} (dram, 308)
[ 2] 2 N DONE@+340 34 LOAD F10120: vle64.v v25, (a2) {0x18c60} (L1, 336)
[ 3] N READY@+0 35 LOAD L10120: vle64.v v25, (a2) {0x18c80} (unknown, 0)
上記の例は命令32と34が同じキャッシュラインにアクセスし、命令32は(dram, 338)とDRAMヒットと判定される。 命令34は (L1, 336) とレイテンシは336サイクルなのにL1ヒットとなってしまう。レイテンシは正確そうだが、これを果たしてL1ヒットと考えるべきなのか、ちょっと微妙だ(インオーダCPUならばそうっぽいけど)。