マイクロプロセッサにもっと多くのレジスタがないのはなぜですか?


18

登録は理論的には必要ありません。すべてのマイクロプロセッサは、レジスタなしでも動作します。しかし、この一見些細な追加により、マイクロプロセッサの効率が向上しました。

さらに利点を引き出すために、さらに多くのレジスターを使用できないのはなぜですか?それらは単なるチップ上のメモリであり、追加するのはそれほど難しくないと想像できますか?レジスタの数に影響を与えた要因は、現在の数であり、10倍以上であると言えますか?


8
@ Alper91架空の現実の多くのアーキテクチャにはレジスタがなく、まったく必要ありません。これは単に便利な最適化です。
パイプ

4
うーん Sparcについては誰も言及していません。最大の実装では、520個のレジスタを使用できます(32ウィンドウx 16個のレジスタ、+ 8個のグローバル)。
ジャンク16

13
レジスタを指定するために必要な命令のビット数は大きな問題だと思います。もし1024個のレジスタを持っている場合は、すべての演算命令のために少なくとも30ビットが必要-すべての3つのレジスタ」のような他の制約を追加しない限り(その場合、あなたは20ビットを必要とする)32の同一群からのものでなければならない。
user253751

8
@pipe-実際には、スタックマシンなどを構築する場合でも、ALUへの引数または出力を保持する場所が必要であるため、実際の設計では、回路図の意味で「レジスタ」が必要です。 -ほとんどのメモリには3つのアクセスポートがありません。また、スタックマシンには、レジスタであるスタックポインタが必要です!また、パイプラインレジスタについては言及しません。このような「レジスタ」の使用をプログラマから隠すことができますが、それでもいくつか必要であり、おそらく原始的なレジスタマシンが持っているのとほぼ同じ数です。
クリスストラットン

4
@ChrisStrattonもちろんですが、ISAを通じて公開されていない限り、それは単に実装の詳細です。しかし、registerによってOPが何を意味するのかわからないので、やや無意味な議論です。
パイプ

回答:


33

いくつかの要因があります。

  • 高性能マイクロアーキテクチャでは、レジスタの名前変更を使用します。つまり、物理レジスタの数は、アーキテクチャ上可視のレジスタの数よりも多く、それらの独立した使用を追跡できます。

  • レジスタの数を2倍にしても、パフォーマンスは2倍になりません。16から32レジスタに移行するISTR(コンピューターアーキテクチャ、定量的アプローチから)は、増加が悪影響を及ぼさないと仮定すると10%の改善をもたらします(非常に楽観的な仮定です)。

  • アーキテクチャ的に見えるレジスタにはコストがかかります。例えば:

    • それらの数を増やすと、命令フォーマットで使用されるビット数が増えて、どのレジスタが作用しているかを示します(レジスタ数を2倍にすると、フォーマット内のレジスタごとにもう1ビットが必要になるため、これらのビットを他の用途に使用したり、より長い命令サイズ)。
    • アーキテクチャレジスタの数を増やすと、コンテキストスイッチングのコストが増加します(コンテキストスイッチで保存および復元する必要があるため)。

1
16〜32個のレジスタのパフォーマンスの向上は、問題のコンパイラの最適化の可能性に完全に依存すると思います。アセンブラーでは、2倍の数のレジスター(x64アーキテクチャー)にアクセスできるため、パフォーマンスが大幅に向上します。ただし、ニッチロールでのみ、実際に使用される場合のみです。
rdtsc 16

6
@rdtsc:8から16のアーキテクチャレジスタに移行すると、この回答からリンクされた論文のシミュレーションのデータよると、一般的なコードのスピル/リロードの量が大幅に改善されます。これは、コードサイズ、命令数、および低遅延ストアフォワーディングの重要性に影響します。16-> 32は、はるかに小さい効果です。AFAICT、16のアーキテクチャレジスタは、WARおよびWAWの危険を取り除くためにレジスタ名を変更するハードウェアに適しています。
ピーター

2
ただし、IntelのAVX512は、合計32個のベクトルregをさらに16個追加します(幅を2倍にして64バイトにすると、完全なキャッシュラインになります)。高スループットの高レイテンシFP操作からレイテンシを隠すには、多くのレジスタが必要になる場合があります。例えば、Intel Haswellは5c lat、0.5cスループットFMAに1つあるため、10個のベクトルアキュムレーターが削減のためにFMA実行ユニットを飽和させる必要があります(ドット積、またはFMAがループキャリー依存関係の一部である配列の合計) )。x86-64には16個のベクトルregしかありません。ただし、整数演算、特に。GPレジストリでは、1cを超えるレイテンシーはほとんどありません。
ピーターコーデス

1
トレードオフは、整数、FP、およびベクトルレジスタで異なります。たとえば、整数レジスタの遅延保存/復元は意味がありません。ベクトル1に対して行うのははるかに良い方法です。また、ベクトルISAには整数1よりも多くのレジスタがあります(AltiVecには少なくとも128まであり、ISTRはSparcについて約256を読み取りましたが、現在は参照を見つけることができません)。
AProgrammer 16

1
en.wikipedia.org/wiki/AltiVecには、32個の128bベクターregがあります。私はSPARCに興味を持ち、そのレジスタウィンドウがコンテキストスイッチでどのように機能するかを調べました。一度に32個のレジスタが表示されますが、より大きなレジスタファイルへのスライディングウィンドウを使用します。この単純化されたバージョンから聞こえるの、OSがそれを保存/復元するためにスライディングウィンドウレジスタファイル全体のサイズを知る必要があるためです。 OSに。
ピーターコーデス

16

レジスタとRAMはどちらもメモリですが、それらにアクセスするコスト(チップ領域または隠されたクロックサイクル)を反映するために、異なる方法でアクセスされます。

レジスタはALUに緊密にバインドされており、データソース、シンク、修飾子などの多くの役割を担うことができます。したがって、豊富な多重接続が必要です。一部のアーキテクチャでは、R1 <= R2 + R3と記述できます。これは、1クロックサイクルで正確に発生します。各レジスタはopコードで直接アドレス指定されます。このアドレス指定は非常に限られたリソースです。

レジスタの実装には費用がかかるため、ほとんどのアーキテクチャでは通常、その数は10/20のオーダーに制限されています。

RAMはCPUに緩やかにバインドされ、通常は単一の共有接続を介してチャネル化されます。これにより、大量のRAMを実装する方がはるかに安くなります。通常、RAMアドレスはレジスタに格納されたアドレスから取得されるため、命令幅を大幅に消費することはありません。

SPARCは興味深いアーキテクチャで、72〜640の64ビットレジスタと、パラメータを渡す高速サブルーチン呼び出しのためにオーバーラップでシフトできる32レジスタコンテキストを備えています。アプリケーションの99.999%のように、コストが問題となるPCやサーバーでそれらを見つける傾向はありません。


4
別の側面として、コンテキストの切り替え中にレジスタを保存/復元する必要があります。より多くのレジスタ、より多くの時間。
ミシェルビロー

古いTMS9900はすべての作業レジスタを外部メモリに保存していたことに注意してくださいen.wikipedia.org/wiki/Texas_Instruments_TMS9900
ピータースミス

1
私は(常に微調整を除いて)「常に」修飾していましたが、簡素化するためにそれを取りました。おそらく私はそれを「一般的に」に変更するだけでしょう。基本的に、例外を見つけて理解できれば、それらを指摘する必要はありません。あなたが誤解されるほど十分に気前が良ければ、それは問題ではありません。それはあなたをトラブルに巻き込まないからです。TMS9900、それは奇妙でした、私は初期の人生の奇妙な獣の罪のために99/4を持っていました!
Neil_UK

Itaniumには登録ウィンドウもあります。
サイモンリヒター

1
@ChrisStratton:「ABI」の一部と見なされる「レジスタXおよびYは使用できない」という先例がありますが(例:mipsのk0およびk1レジスタ)、通常とは異なります。これらの「ABI禁止レジスタ」の保存/復元がコンテキスト切り替えで実行されない場合、プロセス間に不要な/安全でない秘密のメッセージングチャネルが確かにあります。つまり、通信できないはずのプロセスは、禁止されているレジスタに情報を保存し、コンテキストの切り替えを待機することで、通信できる可能性があります。
R ..

12

レジスタは、命令内でアドレス指定する必要があります。レジスタが多数ある場合、命令は長くなります。多数のレジスタがある場合、割り込みサービスのレジスタコンテンツの保存と復元にはさらに時間が必要です。


5

ほとんどの場合、レジスタの数は、コスト、複雑さ、有用性の間の妥協点です。

レジスタはマルチポートスタティックRAMとして実装されるため、他のストレージオプションよりもコストが高くなります(チップ領域)。

次に、それらはプロセッサの命令セットと結合され、レジスタの数を増やすと命令セットの複雑さが増します。そのため、命令セットとの互換性を維持したい場合、効率を高めるために次世代のプロセッサで使用可能なレジスタの数を増やすだけではなく、プログラムはそれらを使用しません。

次に、本当に必要なレジスタの量はどれくらいですか?それらの有用性には限界があります。1024バイトでいくつかの数学演算を実行するアルゴリズムを作成することを考えてみましょう。5倍するとしましょう。現在のレジスタカウントでは、次のような結果になります。

load operand1=5
load address
loop: load operand2=byte1@address
multiply Register1 with Register2
store result
increment address
if address = end goto endLoop
jump loop
endLoop:

ここで、1024個のレジスタとすべてのデータがそこに保存されている場合、プログラムは次のようになります。

multiply Register1 with Register2
multiply Register1 with Register3
multiply Register1 with Register4
multiply Register1 with Register5
multiply Register1 with Register6
...

それらはそれぞれ異なる命令であるため、それらはすべて書き出す必要があります。そのため、必要なプログラムメモリが爆発的に増加しています。これに気付いた後、のようないくつかの指示を導入することができますmultiply register1 with register(2 to 256)。しかし、いつ停止しますか、すべての組み合わせの指示を提供しますか?

そのため、現在入手可能な数値は、コスト、複雑さ、有用性の間の見返りの良いトレードオフになる可能性があります。


1
multiply Register1 with Register2 multiply Register1 with Register3データはコンピューターの外部から直接または間接的に取得されている必要があるため、プログラムは非常に非現実的であるため、レジスターをロードする必要があり、結果をどこかで直接または間接的に使用する必要があるため、レジスターを保存する必要があると思います。実際には、高級言語用のまともな最適化コンパイラは、最初のプログラムのループを「展開」して、2番目のプログラムのようなものを作成し、レジスタの使用、メモリレイテンシ、キャッシュの占有率、実行速度を最適化します。
gbulmer

1
多くの特別な目的のmultiply register1 with register(2 to 256)指示は必要ありません。パイプライン処理は、特に命令のデコードと実行がより簡単な場合に、CPUスループットを大幅に向上させます。したがって、より高い実行率でいくつかのより単純な命令を使用することにより、複雑で大規模な多様な命令の効果を実現できます。レジスタの数を増やすと、コンパイラーが多数の独立した命令(レジスターを共有しない命令)を生成できるようになり、独立して完了できるため、スループットが向上します。あなたの例=より多くのレジスタが優れています。
gbulmer

4

レジスタは非常に高価です。非常に高価です。レジスタ自体ではなく、レジスタとの間のすべての接続です。命令reg1 = reg2 + reg3があるとします。これを高速に実装するには、1つのサイクルで2つのレジスタからデータを読み取り、2番目のサイクルで別のレジスタに書き込む必要があります。サイクルごとに複数の命令、たとえば3つの命令を実行できるプロセッサがある場合、各サイクルで6つのレジスタからデータを読み取り、3つのレジスタにデータを書き込む必要があります。これは、非常に高速で非常に高速な接続です。

もちろん、もっと多くのトランジスタを使用できます。問題は、速度が低下することです。より多くのレジスタから選択するには、より多くのハードウェアが必要です。レジスタファイルのスペースが大きくなります。それはすべて物事を遅くします。そのため、同じテクノロジーを使用すると、16個のレジスタを使用して2,600 MHzで実行したり、32個のレジスタを使用して2,400 MHzで実行したりできます。ここで、追加のレジスタは、クロック速度の大幅な低下を補う必要があります。


2

レジスタの数に影響を与えた要因

- メモリ階層

レジスタ、キャッシュ、RAMはすべて、異なるストレージテクノロジーで実装されています。

さまざまな技術が異なります

  1. アクセス時間
  2. コスト
  3. 密度

例:CPUにある内部レジスタはスタティックランダムアクセスメモリで、コンピューターのメインメモリはダイナミックランダムアクセスメモリです

スタティックRAMバイナリセルは6トランジスタ回路を使用して実装され、ダイナミックRAMバイナリセルはコンデンサとトランジスタを使用して実装されます。SRAMとDRAMの比較

  • SRAMメモリはDRAMメモリよりもはるかに高速です[DRAMと比較してSRAMにアクセスするサイクルはわずかです]
  • SRAM回路はDRAMよりも消費電力が少ない
  • DRAMは、SRAMとは異なり、メモリ内のすべてのビットを定期的に更新する必要があります
  • SRAMはDRAMよりも高価です
  • SRAMはDRAMと比べて密度が低い

したがって、高速で高価な低密度メモリの数を増やすことは実用的ではありません。実際、それらのいくつかを使用する場合があります。よく書かれたプログラムは、これらの高速レジスタ内に最も使用頻度の高いデータを格納し、使用頻度の低いデータは低速メモリに格納します。

- 命令の長さ

レジスタのアドレスは命令内に含まれ、アドレスを表すことができるビットの数に基づいてアクセス可能なレジスタの数を制限します。たとえば、MIPSアーキテクチャでは、32ビット長の命令は、アクセス可能なレジスタのアドレスを表す5ビットのみを保持し、レジスタの数を2 5 = 32レジスタに制限します。レジスタの数を増やすには、すべてのレジスタにアクセスできる十分なビットを含めるために、命令の長さを増やす必要があります。


2

プロセッサの命令セットを見ると、それらをグループ化する方法がいくつかあります。たとえば、すべてのADD命令がグループ化され、すべての命令がグループ化される場合がありますXOR

同じ命令の各グループ内には、メモリまたはレジスタで動作するバージョンが存在する場合があります。プロセッサが持っているレジスタの数を効果的に定義するのはこのサブグループです。

8ビットの仮想的な例として、$Ax命令がADD命令であり、命令である場合$CxがあるとしXORます。この設計では、オペランドを定義するために残っているのは4ビットだけです!

  • 汎用レジスタは4つしかなく、2ビットを使用して1つを定義し、2ビットを使用してもう1つを定義します。
  • または、最初のビットを使用して「特別な」バリアントを区別し、他の3ビットを使用して、8個のレジスタのうちアキュムレータで動作するものを定義します($x0アキュムレータ自体である場合もあります)。
  • または、この数を超えるレジスタを使用できますが、どのレジスタがどの命令にアクセスできるかを制限します。

もちろん、過去の8ビット命令セットです。それでも、このロジックは過去にレジスタセットを定義するのに役立ちました-将来もそうです。

編集(要求に応じて)

4ビットが指示するためのもので、トップを言う:ADDSUBXORMOVCMPなどここで16個の可能性があります。次に、register-to-registerが意味をなす命令(例ADD Rx,Ry:)に対して、Rxおよびを指定する必要がありますRy。次の2ビットが対象xで、最後の2ビットが対象であるとしyます。したがって:

ADD R1, R2  =>  'ADD' + 'R1' + 'R2' => $A0 + $04 + $02

このようにレジスタを定義するのに2ビットしかないため、合計4つのレジスタしか使用できません。

余談ですが、いくつかのレジスタの組み合わせは意味をなさないことに注意してください。たとえば、MOV Rx, Rx(何もしません)およびSUB Rx, Rx(常にを生成します0)。これらは特別な場合の指示になる可能性があります。

  1. SUB Rx, Rxになる可能性がありますNOT Rx-シングルオペランド命令。
  2. MOV Rx, RxMOVとして解釈される、即値として2番目のバイトを取る命令になる可能性がありますMOV Rx, #$yy

このようにして、命令マップを「再生」して、それ以外の場合は役に立たない、または無意味な命令の穴を埋めて、プログラマーにより大きな命令セットを提供できます。しかし、最終的に、命令セットはレジスタセットを定義します。


私はまだ混乱していますが、オペランドに4ビットしか残っていないことを説明できますか?
ダーシャンショーダリー

更新された回答を確認
ジョンバーガー

1
IMHOこの答えは、「8ビットの命令セットを仮定した例」を質問の最初に移動することで大幅に改善されます。私はそれを理解しようとして時間を浪費し、8ビットの固定長命令に対してのみ意味があると結論付け、それが事実であることを見つけるために読み進めました。私見、その種の命令セットは、質問の文脈ではあまり重要ではありません。そのアドレス空間全体は、密結合された静的RAMである可能性があります。また、「一部のレジスタの組み合わせが意味をなさない...」で始まる部分は質問に関連していないため、削除できると思います。私の0.02ドル
gbulmer

-2

Intelは現在、数千のレジスタ(CPUコアあたり数百)を使用しています。しかし、CPUに保存されるデータの最大量はキャッシュにあり、間接的に質問に答えます。キャッシュはレイヤーで構成されており、小さな高速L1キャッシュと低速のL2およびL3キャッシュが遠くにあります。ある意味でのレジスタファイルはL0であり、L1よりも高速ですが、さらに小さくなっています。したがって、レジスタの数を増やすことはできますが、それによりレジスタの速度が低下する可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.