2

Intel Architecture's Developer's Manual (Vol3A、セクション 8-26) には、次のように記載されています。

Pentium プロセッサおよび最近のプロセッサ ファミリは、分岐予測技術を使用して、分岐命令が実行される前に分岐命令の宛先をプリフェッチすることによってパフォーマンスを向上させます。その結果、分岐命令が実行されるとき、命令の実行は決定論的にシリアライズされません。

これは何を意味するのでしょうか?

それは本当に、本当に悪いですね。CPUID のようなシリアル化命令が分岐予測を破る (またはその逆) ように聞こえますが、それはありそうにありません。このコンテキストで「非決定論的」が何を意味するのかを理解するのに、ASM 関係者は助けてくれますか?

*わかりやすくするために編集

4

4 に答える 4

3

非常に紛らわしい言い回しですが、実際の意味は単純だと思います:「ブランチは (必ずしも) 実行をシリアル化しない」. 今日、私たちはこれを当然のことと考えていますが、常にそうであったわけではありません。

于 2011-11-18T22:12:45.817 に答える
2

私はあなたがその声明を誤解していると思いますが、正確にどのように言うことができません. シリアル化命令と分岐予測の間にはどのような関係があると思いますか? 「命令の実行が決定論的にシリアライズされていない」とは、命令のプリフェッチとデコードが分岐予測ロジックに基づいて決定されるため、毎回同じようには機能しないことを意味します。しかし、この全体のポイントは、物事を高速化することです。分岐予測が良好であれば、ほとんどの場合、正しい次の命令がフェッチされ、デコードされ、準備が整います。

于 2011-11-18T22:13:17.077 に答える
1

誤って予測されたブランチはシリアル化命令ですが、正しく予測されたブランチはそうではありません。

分岐が正しく予測されるかどうかは実行されるまでわからないため、命令ストリームがシリアル化されるかどうかを事前に知ることはできません。分岐予測に依存するため、動作は非決定論的です。

おそらく、条件付き分岐の前後のメモリアクセスを使用してコーナーケースを作成できます。この場合、コードの動作は、分岐が正しく予測されたかどうかによって異なります。(つまり、ブランチがシリアル化されているかどうか。)

于 2011-11-19T19:07:28.353 に答える
1

最新のスーパースカラー プロセッサでは、一般に、CPU の外部から見ると、命令の実行が完全に決定論的で順序どおりに行われているように見えます。内部的には、先に命令をフェッチし、投機的に命令を実行し、最も効率的な順序で実行します。しかし、実行されるべきではないもの (分岐の予測ミスなど) はコミットされず、メモリ アクセスは通常、CPU を離れる前に正しい順序に戻されます。CPU パイプラインの最後尾は「リオーダー バッファ」と呼ばれます。これは、完了した命令を追跡し、プログラムの順序で結果を永続的にコミットするだけであるためです。これは、特に分岐の予測ミスや例外などに直面した場合に、適切なプログラムの動作にとって重要です。例外が発生した場合 (例:

メモリの順序付けに関しては、プログラムの順序付けの錯覚にはいくつかの例外があり、読み取りが任意に並べ替えられる可能性があり、読み取りと書き込みの間に何らかの (おそらく投機的な) 並べ替えが存在する可能性がありますが、メモリと対話するときにのみそれを気にします-マップされた I/O ハードウェア。特定の順序を保証する命令があり、CPU はキャッシュされていないメモリへのアクセスの順序に非常に注意を払っています。これは、I/O を意味すると想定されているためです。

于 2012-02-19T03:45:04.610 に答える