私が知る限り、ハードウェア プリフェッチャーは、少なくともメモリを介して一定のストライドを検出してフェッチします。さらに、それが実際に意味するものは何でも、データ アクセス パターンを監視できます。ハードウェア プリフェッチャーは、メモリに格納された実際のデータに基づいて決定を下すのでしょうか、それともプログラムが示している動作に純粋に基づいて決定を下すのでしょうか?
私が尋ねる理由は、「非ネイティブ」ポインターをポインターとして使用することがあるためです。これの簡単な例は、事前に割り当てられたものの配列と、ポインターの代わりにこの配列にインデックスを付ける小さな整数です。このような「ポインタ」を大量に保存する必要がある場合、メモリの節約はすぐに加算され、使用するメモリが少なくなるため、間接的にキャッシュのパフォーマンスが向上します。
しかし、私が知る限り、これはハードウェア プリフェッチャーの動作に干渉する可能性があります。か否か!
現実的であろうとなかろうと、ネイティブ ポインター アドレスの L1 キャッシュに入るキャッシュ ラインを調べ、それらを L2 などにフェッチし始めるプリフェッチ ユニットを想像できます。その場合、メモリを節約するという私の巧妙なトリックは、突然あまり賢く見えなくなります。
では、最新のハードウェア プリフェッチャーは実際に何をするのでしょうか? それらは「非ネイティブ」ポインターによってつまずくことができますか?