私の理解では、ハードウェアのプリフェッチは決してページの境界を越えることはありません。ソフトウェア プリフェッチに同じ制限があるかどうか、つまり、将来の TLB ミスを回避するためにソフトウェア プリフェッチを使用できるかどうか疑問に思っています。調べてみると可能のようですが、ドキュメントに決定的なものが見つからなかったので、参考にしてください。
Nehalem、Sandy Bridge、Westmere に特に興味があります。
Intelの最適化リファレンスマニュアルによると、プロセッサによって異なります。セクション7.4.3から:
PREFETCHがデータのプリフェッチを実行しない場合があります。これらには以下が含まれます:
- PREFETCHは、DTLB(データ変換ルックアサイドバッファ)ミスを引き起こします。これは、ファミリ15、モデル0、1、または2に対応するCPUID署名を持つPentium 4プロセッサに適用されます。PREFETCHはDTLBミスを解決し、ファミリ15、モデル3に対応するCPUID署名を持つPentium4プロセッサでデータをフェッチします。
- 障害/例外を引き起こす指定されたアドレスへのアクセス。
ソフトウェアのプリフェッチは、プロセッサによってはTLBミスを回避する場合と回避しない場合があります。ページフォールトが発生する場合、データはフェッチされません。
TLBミスを確実に回避したい場合は、プリフェッチ命令の代わりにダミー読み取りを実行してデータをロードできます。これにより、ページフォールトがページ内でスワップする可能性があり、ユースケースに応じて良い場合と悪い場合があります。
最新のプロセッサ (Nehalem、Sandy Bridge、および Westmere) では、ソフトウェアのプリフェッチが実際に TLB ルックアップをトリガーします。
インテルの最適化ガイドから: (セクション 7.3.3)
古いマイクロアーキテクチャでは、Data Translation Lookaside Buffer (DTLB) ミスを引き起こす PREFETCH が削除されていました。Nehalem、Westmere、Sandy Bridge、および新しいマイクロアーキテクチャに基づくプロセッサ、Intel Core 2 プロセッサ、および Intel Atom プロセッサでは、DTLB ミスを引き起こす PREFETCH がページ境界を越えてフェッチされる可能性があります。