Intelのマイクロアーキテクチャで採用されているプリフェッチャの構成について調べたくなったので、いろんな文献を探して調査した。
参考にしたのは、"Resolving a L2-prefetch-caused parallel nonscaling on Intel Core microarchitecture"という文献。
https://www.sciencedirect.com/science/article/abs/pii/S0743731511000736
Dual-Coreプロセッサには合計8つのプリフェッチャが搭載されている。
- I0/I1 : 従来の命令プリフェッチャ
- P0/P1 : 命令ポインタベース(IP)のL1データプリフェッチャ
- S0/S1 : L1データキャッシュ向けのストリームプリフェッチャ。決められた機関に1つのキャッシュ・ラインから複数回の読み出しを検出してプリフェッチする
- D0/D1 : データ・プリフェッチ・ロジック(DPL)、L1ストリーミングプリフェッチャと同様の機能を持つが、2つの連続するキャッシュライン上の要求を検出する
- L1データキャッシュがキャッシュラインIとI+1を要求した場合、DPLはI+2をL2キャッシュにロードする。
- その後、L1データキャッシュがI+2を読み出すと、DPLはキャッシュラインI+3をロードする。
- Adjacent CacheLine プリフェッチャ : 自動的に64バイトのキャッシュ・ラインを2本プリフェッチする。
これらのプリフェッチャは、0x1A0 にあるモデル固有レジスタ(MSR) IA32_MISC_ENABLEの内容を変更することで設定できる。
- ビット9 : DPLプリフェッチ
- ビット19 : Adjacent CacheLineプリフェッチ
- ビット37 : L1ストリーミングプリフェッチ
- ビット39 : L1 IPベースプリフェッチ
L1Dキャッシュ上のミスはL2キャッシュに送られ、それは通常の要求として扱われる。さらにL2キャッシュミスが発生すると、それらはシステムバスに送られ、L2プリフェッチャD0/D1によって生成されたプリフェッチ要求とともにバスキューに並ぶことになる。