以下の内容はhttps://msyksphinz.hatenablog.com/entry/2025/01/04/040000より取得しました。


サイクル精度シミュレータSniperのキャッシュ ヒット・ミスの判定アルゴリズムについて

サイクル精度シミュレータの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ならばそうっぽいけど)。




以上の内容はhttps://msyksphinz.hatenablog.com/entry/2025/01/04/040000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14