登録は理論的には必要ありません。すべてのマイクロプロセッサは、レジスタなしでも動作します。しかし、この一見些細な追加により、マイクロプロセッサの効率が向上しました。
さらに利点を引き出すために、さらに多くのレジスターを使用できないのはなぜですか?それらは単なるチップ上のメモリであり、追加するのはそれほど難しくないと想像できますか?レジスタの数に影響を与えた要因は、現在の数であり、10倍以上であると言えますか?
登録は理論的には必要ありません。すべてのマイクロプロセッサは、レジスタなしでも動作します。しかし、この一見些細な追加により、マイクロプロセッサの効率が向上しました。
さらに利点を引き出すために、さらに多くのレジスターを使用できないのはなぜですか?それらは単なるチップ上のメモリであり、追加するのはそれほど難しくないと想像できますか?レジスタの数に影響を与えた要因は、現在の数であり、10倍以上であると言えますか?
回答:
いくつかの要因があります。
高性能マイクロアーキテクチャでは、レジスタの名前変更を使用します。つまり、物理レジスタの数は、アーキテクチャ上可視のレジスタの数よりも多く、それらの独立した使用を追跡できます。
レジスタの数を2倍にしても、パフォーマンスは2倍になりません。16から32レジスタに移行するISTR(コンピューターアーキテクチャ、定量的アプローチから)は、増加が悪影響を及ぼさないと仮定すると10%の改善をもたらします(非常に楽観的な仮定です)。
アーキテクチャ的に見えるレジスタにはコストがかかります。例えば:
レジスタとRAMはどちらもメモリですが、それらにアクセスするコスト(チップ領域または隠されたクロックサイクル)を反映するために、異なる方法でアクセスされます。
レジスタはALUに緊密にバインドされており、データソース、シンク、修飾子などの多くの役割を担うことができます。したがって、豊富な多重接続が必要です。一部のアーキテクチャでは、R1 <= R2 + R3と記述できます。これは、1クロックサイクルで正確に発生します。各レジスタはopコードで直接アドレス指定されます。このアドレス指定は非常に限られたリソースです。
レジスタの実装には費用がかかるため、ほとんどのアーキテクチャでは通常、その数は10/20のオーダーに制限されています。
RAMはCPUに緩やかにバインドされ、通常は単一の共有接続を介してチャネル化されます。これにより、大量のRAMを実装する方がはるかに安くなります。通常、RAMアドレスはレジスタに格納されたアドレスから取得されるため、命令幅を大幅に消費することはありません。
SPARCは興味深いアーキテクチャで、72〜640の64ビットレジスタと、パラメータを渡す高速サブルーチン呼び出しのためにオーバーラップでシフトできる32レジスタコンテキストを備えています。アプリケーションの99.999%のように、コストが問題となるPCやサーバーでそれらを見つける傾向はありません。
ほとんどの場合、レジスタの数は、コスト、複雑さ、有用性の間の妥協点です。
レジスタはマルチポートスタティック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)
。しかし、いつ停止しますか、すべての組み合わせの指示を提供しますか?
そのため、現在入手可能な数値は、コスト、複雑さ、有用性の間の見返りの良いトレードオフになる可能性があります。
multiply Register1 with Register2 multiply Register1 with Register3
データはコンピューターの外部から直接または間接的に取得されている必要があるため、プログラムは非常に非現実的であるため、レジスターをロードする必要があり、結果をどこかで直接または間接的に使用する必要があるため、レジスターを保存する必要があると思います。実際には、高級言語用のまともな最適化コンパイラは、最初のプログラムのループを「展開」して、2番目のプログラムのようなものを作成し、レジスタの使用、メモリレイテンシ、キャッシュの占有率、実行速度を最適化します。
multiply register1 with register(2 to 256)
指示は必要ありません。パイプライン処理は、特に命令のデコードと実行がより簡単な場合に、CPUスループットを大幅に向上させます。したがって、より高い実行率でいくつかのより単純な命令を使用することにより、複雑で大規模な多様な命令の効果を実現できます。レジスタの数を増やすと、コンパイラーが多数の独立した命令(レジスターを共有しない命令)を生成できるようになり、独立して完了できるため、スループットが向上します。あなたの例=より多くのレジスタが優れています。
レジスタは非常に高価です。非常に高価です。レジスタ自体ではなく、レジスタとの間のすべての接続です。命令reg1 = reg2 + reg3があるとします。これを高速に実装するには、1つのサイクルで2つのレジスタからデータを読み取り、2番目のサイクルで別のレジスタに書き込む必要があります。サイクルごとに複数の命令、たとえば3つの命令を実行できるプロセッサがある場合、各サイクルで6つのレジスタからデータを読み取り、3つのレジスタにデータを書き込む必要があります。これは、非常に高速で非常に高速な接続です。
もちろん、もっと多くのトランジスタを使用できます。問題は、速度が低下することです。より多くのレジスタから選択するには、より多くのハードウェアが必要です。レジスタファイルのスペースが大きくなります。それはすべて物事を遅くします。そのため、同じテクノロジーを使用すると、16個のレジスタを使用して2,600 MHzで実行したり、32個のレジスタを使用して2,400 MHzで実行したりできます。ここで、追加のレジスタは、クロック速度の大幅な低下を補う必要があります。
レジスタの数に影響を与えた要因
レジスタ、キャッシュ、RAMはすべて、異なるストレージテクノロジーで実装されています。
さまざまな技術が異なります
例:CPUにある内部レジスタはスタティックランダムアクセスメモリで、コンピューターのメインメモリはダイナミックランダムアクセスメモリです
スタティックRAMバイナリセルは6トランジスタ回路を使用して実装され、ダイナミックRAMバイナリセルはコンデンサとトランジスタを使用して実装されます。SRAMとDRAMの比較
したがって、高速で高価な低密度メモリの数を増やすことは実用的ではありません。実際、それらのいくつかを使用する場合があります。よく書かれたプログラムは、これらの高速レジスタ内に最も使用頻度の高いデータを格納し、使用頻度の低いデータは低速メモリに格納します。
レジスタのアドレスは命令内に含まれ、アドレスを表すことができるビットの数に基づいてアクセス可能なレジスタの数を制限します。たとえば、MIPSアーキテクチャでは、32ビット長の命令は、アクセス可能なレジスタのアドレスを表す5ビットのみを保持し、レジスタの数を2 5 = 32レジスタに制限します。レジスタの数を増やすには、すべてのレジスタにアクセスできる十分なビットを含めるために、命令の長さを増やす必要があります。
プロセッサの命令セットを見ると、それらをグループ化する方法がいくつかあります。たとえば、すべてのADD
命令がグループ化され、すべての命令がグループ化される場合がありますXOR
。
同じ命令の各グループ内には、メモリまたはレジスタで動作するバージョンが存在する場合があります。プロセッサが持っているレジスタの数を効果的に定義するのはこのサブグループです。
8ビットの仮想的な例として、$Ax
命令がADD
命令であり、命令である場合$Cx
があるとしXOR
ます。この設計では、オペランドを定義するために残っているのは4ビットだけです!
$x0
アキュムレータ自体である場合もあります)。もちろん、過去の8ビット命令セットです。それでも、このロジックは過去にレジスタセットを定義するのに役立ちました-将来もそうです。
編集(要求に応じて)
4ビットが指示するためのもので、トップを言う:ADD
、SUB
、XOR
、MOV
、CMP
などここで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
)。これらは特別な場合の指示になる可能性があります。
SUB Rx, Rx
になる可能性がありますNOT Rx
-シングルオペランド命令。MOV Rx, Rx
MOV
として解釈される、即値として2番目のバイトを取る命令になる可能性がありますMOV Rx, #$yy
。このようにして、命令マップを「再生」して、それ以外の場合は役に立たない、または無意味な命令の穴を埋めて、プログラマーにより大きな命令セットを提供できます。しかし、最終的に、命令セットはレジスタセットを定義します。