18

最も一般的な CPU (x86) にレジスタが 4 つしかないのはなぜですか? レジスタを追加すると、速度が大幅に向上するのではないでしょうか? レジスターはいつ追加されますか?

4

9 に答える 9

25

x86 には、常に5 つ以上のレジスタがありました。本来は、CS、DS、ES、SS、AX、BX、CX、DX、SI、DI、BP、SP、IP、Flags があります。それらのうち、7 つ (AX、BX、CX、DX、SI、DI、および BP) は、最も一般的な操作 (加算、減算など) をサポートしました。BP と BX は、「ベース」レジスタとしての使用もサポートしました (つまり、間接)。SI と DI はインデックス レジスタとしても使用できます。これはベース レジスタとほぼ同じですが、命令は 1 つのベース レジスタと 1 つのインデックス レジスタからアドレスを生成できますが、2 つのインデックス レジスタまたは 2 つのベース レジスタからは生成できません。少なくとも通常の使用では、SP はスタック ポインターとして機能することに専念します。

それ以来、レジスタはより大きくなり、より多くが追加され、それらのいくつかはより用途が広くなったため、(たとえば) 2 レジスタ アドレッシング モードで任意の 2 つの汎用レジスタを使用できるようになりました。少し奇妙なことに、2 つのセグメント レジスタ (FS と GS) が 386 に追加されました。これにより、32 ビット セグメントも許可され、ほとんどすべてのセグメント レジスタがほとんど無関係になりました。これらは、スレッド ローカル ストレージに使用されることがあります。

また、マルチタスクやマルチスレッドなどを実行する場合、多くのレジスタがかなり深刻なペナルティを負う可能性があることも付け加えておきます。どのレジスタが使用されているかわからないため、コンテキストスイッチを実行すると1 つのタスクですべてのレジスタを保存し、次のタスクのために保存されたすべてのレジスタをロードします。Itanium や 200 以上のレジスタを持つ SPARC のような CPU では、これはかなり遅くなる可能性があります。最近の SPARC は、これを最適化するためにかなりの量のチップ領域を費やしていますが、それらのタスク スイッチは依然として比較的低速です。Itanium ではさらに悪化します。タスク スイッチが (非常に) 少ない科学計算では問題なく動作するにもかかわらず、典型的なサーバー タスクでは印象的ではない理由の 1 つです。

最後に、もちろん、これらすべては、合理的に最新の x86 の実装がどのように機能するかとはまったく異なります。Pentium Pro 以降、インテルはアーキテクチャー・レジスター (つまり、命令でアドレス指定できるレジスター) を実装から分離しました。順不同の同時実行をサポートするために、Pentium Pro は (メモリが機能する場合) 40 個の内部レジスタのセットを持ち、「レジスタの名前変更」を使用して、そのうちの 2 つ (またはそれ以上) が特定のアーキテクチャ レジスタに特定の時間に対応するようにしました。 . たとえば、レジ​​スタを操作してから格納し、別の値をロードしてそれを操作する場合、プロセッサはロードによってこれら 2 つの命令セット間の依存関係チェーンが切断されたことを検出できるため、両方の操作を同時に実行できます。

もちろん、Pentium Pro は今ではかなり古いものです。もちろん、AMD もしばらく前から存在しています (ただし、この点では設計はかなり似ています)。詳細は新しいプロセッサーで変更されますが、物理レジスターからアーキテクチャー・レジスターを分離する名前変更機能を持つことは、多かれ少なかれ現実になっています。

于 2010-05-20T22:58:52.397 に答える
9

今日4人以上。x86 アーキテクチャの歴史を見ると、8086 命令セットから進化したことがわかります。Intel は常に、そのプロセッサ ラインである程度の下位互換性を維持したいと考えていたため、後続のプロセッサはすべて、元の A、B、C、D レジスタをより広いビット数に単純に拡張しました。元のセグメント レジスタは、実際にはもうセグメントが存在しないため、今日では一般的な目的で使用できます (これは単純化しすぎていますが、おおむね正しいです)。新しい x64 アーキテクチャには、追加のレジスタもいくつか用意されています。

于 2010-05-20T22:43:03.350 に答える
7

X86 は実際には 8 レジスタのマシンです (eax/ebx/ecx/edx/esi/edi/ebp/esp)。そのうちの 1 つがスタック ポインター/ベース ポインターに失われるため、実際の使用では 7 になります。これは少し低めですが、一部の RISC マシンでさえ 8 つ (THUMB モードの SuperH および ARM、16 ビット命令があるため)サイズ以上のレジスタは、エンコードするには長すぎます!)。64ビットコードの場合、8から16にアップグレードします(AFAIKの命令エンコードで残りのビットを使用しました)。

それでも、8 つのレジスタは、CPU をパイプライン処理するのに十分であり、486 やペンティアムに最適です。6502/65816 のような他のいくつかのアーキテクチャは、高速な順序でパイプライン化されたバージョンを作成できないため、32 ビット時代の初期に消滅しました (レジスタが 3 つしかなく、一般的な数学用に 1 つしかないため、すべてがストールを引き起こします! )。すべてのレジスターの名前が変更され、すべてが故障している世代 (ペンティアム 2 など) に到達すると、それはもはや問題ではなく、同じレジスターを何度も再利用してもストールすることはありません。 8 レジスタで十分です。

レジスタを増やすもう 1 つの用途は、ループ定数をレジスタに保持することです。x86 ではその必要はありません。すべての命令がメモリ ロードを実行できるため、すべての定数をメモリに保持できます。これは RISC に (定義上) 欠けている機能の 1 つであり、パイプライン化が容易になり (最長のレイテンシーは 3 サイクルではなく 2 サイクルになります)、わずかにスーパースカラーであるため、RISC はそれを補っていますが、コード サイズは依然として少し増加します。 ..

レジスタを追加することには、明らかでないコストがいくつかあります。より多くのビットが必要になるため、命令が長くなり、プログラムのサイズが大きくなり、命令を読み取るメモリ帯域幅によってコード速度が制限されると、プログラムが遅くなります!

また、レジスタ ファイルが大きくなればなるほど、値を読み取るために必要なマルチプレクサ レベルや一般的な回路が増えるため、レイテンシが増加し、クロック速度が低下する可能性があります。

これが、32 を超えるレジスタは実際には良い考えではなく (特に、順序が狂った CPU では役に立たない)、8 は少なすぎる (メモリの読み取りには依然としてコストがかかる!) という従来の知恵がある理由です。そして、理想的なアーキテクチャが 75% RISC 25% CISC のようなものであると考えられる理由、および ARM が普及している理由 (ちょうどいいバランスです!)、ほとんどすべての RISC アーキテクチャにはまだいくつかの CISC 部分があります (すべてのメモリ OP でのアドレス計算、32 ビット オペコード)。しかし、それ以上ではありません!)、なぜ Itanium は失敗したのですか (128 ビット オペコード? 64 レジスタ? メモリ操作でアドレス計算がない???)。

これらすべての理由から、x86 を超えたわけではありません。確かに命令エンコーディングは完全に正気ではありません。まさに、POWER6 などのさまざまなよりシンプルなインオーダー設計よりも優位に立っています。すべてを並べ替えて名前を変更すると、とにかくすべての命令セットが多かれ少なかれ同じになるため、特定のケース (本質的に GPU) を除いて、実際に高速な設計を作成することは非常に困難です。ARM CPU が x86s と同じくらい高速になると、Intel が発表したものと同じくらいクレイジーで複雑になります。

于 2013-08-16T18:24:56.020 に答える
4
  1. レジスターは、以前は実装に費用がかかりました。
  2. 必ずしも。最新の x86 CPU のレジスタ数は、CPU が明らかにする数をはるかに超えています。CPU は、命令フローに基づいて必要に応じて名前が変更されるシャドウ レジスタを維持します。
  3. AMD64/x86_64 で。64 ビット モードで実行すると、汎用レジスタの数が 2 倍になります (サイズが 2 倍になるだけでなく)。

より多くのレジスタを備えた多くのアーキテクチャがあります (ARM、PowerPC など)。スタックを操作する作業が減り、命令が短くなる可能性があるため (スタック変数を参照する必要がないため)、より高い命令スループットを達成できる場合があります。対抗点は、より多くのレジスターを節約するために、関数呼び出しがより高価になることです。

于 2010-05-20T22:43:29.013 に答える
2

レジスターが多くても必ずしも高速になるとは限りません。レジスターは他のコンポーネントの近くに配置する必要があり、多くの命令は特定のレジスターでのみ動作するため、CPU アーキテクチャがより複雑になります。

しかし、最近の CPU には 4 つ以上のレジスタがあり、私の頭の上には AX、BX、CX、DX、SI、DI、BP があります。次に、CPU には PIC (プロセッサ命令カウンタ) などの内部レジスタがあります。

于 2010-05-20T22:47:54.467 に答える
0

それは単にアーキテクチャ上の決定に依存します。Intel Itanium には 128 の汎用レジスタと 128 の浮動小数点レジスタがありますが、Intel x86 には 8 つの汎用レジスタと 8 つの float のスタックしかありません。

于 2010-05-20T23:00:30.113 に答える
0

そうですね、他にもありますが、4 つは単に特別なものであり、「汎用」であると思います。これらすべての理由と、残りがあまり使用されない理由は次のとおりです。

  • x86 は、事実上の標準となる最適な命令セットではありませんでした。Intel は下位互換性の可能性を認識しただけで、AMD が参加するのは時間の問題でした。
  • それは今では事実上の標準なので、私たちはそれと一緒に暮らす必要があります.
  • レジスタを追加することは x86 ではなくなるため、「より多くのレジスタを使用して x86 に基づいて新しい命令セットを作成する」ことを意味します。
  • ほとんどのコンパイラは、x86 にコンパイルして x86 のスーパーセットもターゲットにすることができるため、これらを使用しません。
  • レジスタが増えるということは、ハードウェアが高価になるということです。
于 2010-05-20T22:44:27.670 に答える
0

レジスタが使用するメモリは、CPU で設計するには非常にコストがかかります。そうすることの設計上の困難は別として、使用可能なレジスタの数を増やすと、CPU チップがより高価になります。

加えて:

  • よりコスト効率の高い CPU パフォーマンスを向上させる方法は他にもあります。
  • さらに導入された場合でも、命令セットを更新し、コンパイラを使用するように変更する必要があります。
  • すでに 4 つ以上の登録があります: ウィキペディアから (世界、ええ、最も信頼できる情報源)
    • AX/EAX/RAX: アキュムレータ
    • BX/EBX/RBX: ベース インデックス (例: 配列)
    • CX/ECX/RCX:カウンター
    • DX/EDX/RDX: データ/一般
    • SI/ESI/RSI: 文字列操作の「ソース インデックス」。
    • DI/EDI/RDI: 文字列操作の「宛先インデックス」。
    • SP/ESP/RSP: スタックのトップアドレスのスタックポインタ。
    • BP/EBP/RBP: 現在のスタック フレームのアドレスを保持するためのスタック ベース ポインタ。
    • IP/EIP/RIP: 命令ポインター。プログラム カウンター、現在の命令アドレスを保持します。
于 2010-05-20T22:44:29.857 に答える
0

うーん..... (E/R)AX、(E/R)BX、(E/R)CX、(E/R)DX、(E/R)SI、(E/R)DI、(E /R)SP、(E/R)BP、(E/R)IP。私はそれを4以上と数えます。:)

于 2010-05-20T22:45:15.487 に答える