4

順不同のプロセッサーが次のような状況に遭遇した場合

LOAD R1, 0x1337
LOAD R2, $R1
LOAD R3, 0x42

すべてのアクセスがキャッシュ ミスになると仮定すると、プロセッサは、$R1 または 0x1337 の内容を要求する前に、メモリ コントローラに 0x42 の内容を要求できますか? もしそうなら、$R1 にアクセスすると例外 (セグメンテーション違反など) が発生すると仮定すると、0x42 は投機的にロードされたと見なすことができますよね?

ところで、ロードストア ユニットがメモリ コントローラにリクエストを送信する場合、前のリクエストに対する応答を受信する前に、2 つ目のリクエストを送信できますか?

私の質問は、特定のアーキテクチャを対象としていません。主流のアーキテクチャに関連する回答は大歓迎です。

4

4 に答える 4

6

質問への回答は、CPU のメモリ順序付けモデルによって異なります。これは、順不同の実行を許可する CPU とは異なります。CPU が合計ストア順序付け (x86 または Sparc など) を実装している場合、質問に対する答えは、0x42 は 0x1337 より前にロードされないということです。

CPU が緩和されたメモリ モデル (IA-64、PowerPC、alpha など) を実装している場合、メモリ フェンス命令が存在しない場合、最初にアクセスされるのはどれかという賭けはすべてオフになります。これは、IO を行っている場合やマルチスレッド コードを扱っている場合を除き、ほとんど関係ありません。

一部の CPU (Itanium など) ではメモリ モデルが緩和されていますが (読み取りが順不同である可能性があります)、コンパイラが命令と投機的命令を最適な方法で順序付けることを期待しているため、順不同の実行ロジックはありません。 OOE にシリコン スペースを費やすのではなく、

于 2012-10-07T22:52:17.203 に答える
4

これは、複数のロード/ストア ユニットを備えたスーパースケーラ CPU の論理的な結論でもあるようです。最近では、マルチチャネル メモリ コントローラーがかなり一般的になっています。

順不同の命令実行の場合、命令がストリーム内の他の命令に依存しているかどうかを判断するために膨大な量のロジックが費やされます。これは、レジスタの依存関係だけでなく、メモリに対する操作も同様です。また、例外を処理するための膨大な量のロジックがあります。CPU は、障害が発生するまでストリーム内のすべての命令を完了する必要があります (または、その一部をオペレーティング システムにオフロードします)。

ほとんどのアプリケーションで見られるプログラミング モデルに関しては、その影響は明らかではありません。メモリからわかるように、ロードが常に期待される順序で行われるとは限らないことは暗示的ですが、キャッシュが使用されている場合は常にそうです。

明らかに、ロードとストアの順序が重要な状況では、たとえばデバイス レジスタへのアクセスでは、OOE を無効にする必要があります。POWER アーキテクチャーには、EIEIOこの目的のための優れた命令があります。

ARM Cortex-A ファミリの一部のメンバーは OOE を提供しています。これらのデバイスの電力の制約と、順序付けを強制するための命令の明らかな欠如により、ロードストアは常に順序どおりに完了するのではないかと思います。

于 2012-09-20T19:08:45.477 に答える
1

準拠する SPARC プロセッサはTSO を実装する必要がありますが、 RMO および PSO も実装する場合があります。特定のハードウェア プラットフォームに RMO と PSO が実装されていないことがわかっていない限り、OS がどのモードで実行されているかを知る必要があります。

于 2013-02-08T07:23:36.807 に答える