メモリ依存性予測は、プログラム順序とは無関係にメモリアクセス操作(ロードとストア)を実行する高性能アウトオブオーダー実行マイクロプロセッサが、命令実行時にロードとストア間の真の依存関係を予測するために用いる技術です。予測された依存関係情報に基づいて、プロセッサは特定のロードとストアを投機的にアウトオブオーダーで実行することを決定し、他のロードとストアがアウトオブオーダーで実行されるのを防ぎます(順序通りに実行します)。パイプラインの後段では、メモリ曖昧性解消技術を用いて、ロードとストアが正しく実行されたかどうかを判断し、正しく実行されなかった場合は回復します。
メモリ依存性予測器を使用して、ほとんどの依存ロードとストアを正しい順序に保つことで、プロセッサは積極的なアウトオブオーダーロード/ストア実行のメリットを享受しつつ、ロードとストアが誤って実行された場合に発生する多くのメモリ依存性違反を回避できます。これにより、これらのメモリ依存性違反から回復するために必要なパイプラインフラッシュの回数が減るため、パフォーマンスが向上します。メモリ依存性、メモリ依存性違反、および回復の詳細については、メモリ曖昧性解消に関する記事を参照してください。
一般的に、メモリ依存性予測は、2 つのメモリ操作が依存しているかどうか、つまり、同じメモリ位置にアクセスすることで相互作用するかどうかを予測します。ロードとストアの順不同スケジューリングにストア・トゥ・ロード (RAW または真の) メモリ依存性予測を使用する以外にも、メモリ依存性予測の他のアプリケーションが提案されています。たとえば、[ 1 ]を参照してください。
メモリ依存性予測は、メモリ依存性推測の上に構築された最適化です。逐次実行セマンティクスでは、ストアとロードはプログラムで指定された順序で実行されるように見えます。しかし、他の命令の順不同実行と同様に、2 つのメモリ操作をプログラムで示唆されている順序とは異なる順序で実行できる場合があります。これは、2 つの操作が独立している場合に可能です。メモリ依存性推測では、ロードは、その前に実行されるストアよりも前に実行できます。推測は、ロードがストアから独立している場合、つまり、2 つの命令が異なるメモリ位置にアクセスする場合に成功します。推測は、ロードがストアに依存している場合、つまり、2 つのアクセスがメモリ内で重複する場合に失敗します。最初の、現代的な順不同設計では、メモリ推測の利点が限られていたため、使用されませんでした。順不同実行の範囲が数十個の命令を超えて拡大するにつれて、単純なメモリ依存性推測が使用されるようになりました。単純なメモリ依存性推測では、[ 2 ]ロードは、先行するストアをバイパスできます。あらゆる投機と同様に、正しい投機によるメリットと、誤った投機によるデメリットを比較検討することが重要です。アウトオブオーダー実行の範囲が数十命令にまで拡大するにつれて、単純な投機によるパフォーマンス上のメリットは減少します。積極的なメモリ依存投機のメリットを維持しつつ、誤った投機によるコストを回避するために、いくつかの予測器が提案されています。
選択的メモリ依存性予測[ 2 ] [ 3 ]は、違反が発生しないことが確実になるまで特定のロードを停止します。これは、依存性を明示的に予測しません。この予測器は、必要以上にロードを遅延させ、結果として最適ではないパフォーマンスをもたらす可能性があります。実際、場合によっては、すべてのロードをできるだけ早く単純に推測するよりもパフォーマンスが悪くなります。これは、多くの場合、先行するすべてのストアの実行を待つよりも、誤った推測をして回復する方が速いためです。正確なメモリ依存性予測は、ウィスコンシン大学マディソン校で開発されました。具体的には、動的推測と同期[ 2 ] [ 3 ] は、ロードが待つべき正確なストアを予測することで、必要な期間だけロードを遅延させます。この予測器は、正確な依存性 (ストアとロードのペア) を予測します。同義語予測器[ 1 ]は、共通のロードまたはストア命令を共有するすべての依存性をグループ化します。ストアセット[ 4 ]予測器は、ロードが依存する可能性のあるすべてのストアをグループ化することで、複数の潜在的な依存性を効率的に表現します。ストアバリア[ 5 ]予測器は、特定のストア命令をバリアとして扱います。つまり、後続のすべてのロードまたはストア操作は、特定のストアをバイパスすることを許可されません。ストアバリア予測器は、依存関係を明示的に予測しません。この予測器は、後続の独立したロードを不必要に遅延させる可能性があります。メモリ依存性予測には、ロードとストアのスケジューリング以外にもアプリケーションがあります。たとえば、投機的メモリクローキング[ 1 ]と投機的メモリバイパス[ 1 ]は、メモリ依存性予測を使用して、メモリを介した値の通信を効率化します。
ロード命令とストア命令のメモリ依存性予測は、条件分岐命令の分岐予測に類似しています。分岐予測では、分岐予測器が分岐がどの方向に解決されるかを、結果が判明する前に予測します。プロセッサは、分岐のパスのいずれかに沿って命令を投機的にフェッチして実行できます。その後、分岐命令が実行されると、分岐命令が正しく予測されたかどうかを判断できます。正しく予測されなかった場合、これは分岐予測の誤りであり、投機的にフェッチして実行された命令を破棄するためにパイプラインフラッシュが必要になります。
分岐予測は2段階のプロセスと考えることができます。まず、予測器は分岐の方向(分岐するかしないか)を決定します。これは二値的な決定です。次に、予測器は実際のターゲットアドレスを決定します。同様に、メモリ依存性予測も2段階のプロセスと考えることができます。まず、予測器は依存性があるかどうかを判断します。次に、どの依存性があるかを判断します。