CPUレジスタとは何ですか?


27

この質問は、しばらくの間私を悩ませており、今日、私はそれをグーグルにするだろうと考えました。私はそれについていくつかのことを読んだことがありますが、それは私がいつもプロセッサーキャッシュと呼んでいたものと非常に似ているように見えました。

2つの間に違いはありますか、または私はそれらが同じだと思うときに正しいですか?レジスタは、実際に動作するためにCPU内にある必要がありますか?

ウィキペディアによると、レジスタは、RAMに送り返される前にメモリにすばやくアクセスして変更できるCPU内の場所です。私はこれを間違って理解しましたか、またはキャッシュとレジスタは実際に同じですか?


13
CPUレジスタは、CPUを追跡する組織です。NSAは、CPUレジスタの一例です。
ジミー・ホッファ

3
CPUレベル1キャッシュは、多くの場合、レジスタと同じ種類のシリコンで構成されています。キャッシュされたアドレスをキャッシュの場所に関連付けるには追加のルックアップが必要なため、それほど高速ではありません。ただし、レジスタとキャッシュはチップ上の明らかに異なる場所です。
ザンリンクス

3
@JimmyHoffa:あなたのコメントはOPを非常に混乱させ、コンピューターサイエンスの知識を損なうことになると思います。
-rwong

3
@rwong Nah私はそれを得た、私はそれがかなり面白いと思った。:P
Jeroen

1
もう1つの違いはサイズです。レジスタファイルが数百ワードよりも大きいことはめったにありませんが、L1キャッシュは64kの大きさになる可能性があります。
SKロジック

回答:


61

それらはまったく同じではありません。レジスタは、CPUが実際に処理している値が置かれている場所です。CPUの設計では、値がレジスタ内にある場合にのみ、実際に変更またはその他の方法で動作することができます。したがって、レジスタはロジックを使用できますが、メモリ(キャッシュを含む)は、CPUが読み書きする値のみを保持できます。

大工が働いていると想像してください。彼は手にいくつかのアイテム(レジスタ)を持っています。そして、頻繁に作業しているワークベンチ(キャッシュ)に非常に近いですが、この瞬間、そしてワークショップ(メインメモリ)に関連するものプロジェクトは手元にありますが、すぐにワークベンチに置くほど重要ではありません。

編集:ここでは、レジスタロジックの仕組みについて簡単に説明します。

R1..R4という名前の4つのレジスタがあるとします。次のようなステートメントをコンパイルする場合:

x = y + z * 3;

コンパイラは、(逆アセンブルされたときに)次のようなマシンコードを出力します。

LOAD  R1, ADDRESS_Z //move the value of Z into register 1
MUL   R1, 3         //multiply the value of register 1 by 3
LOAD  R2, ADDRESS_Y //move the value of Y into register 2
ADD   R1, R2        //adds the value in R2 to the value in R1
STORE R1, ADDRESS_X //move the value of register 1 into X

最新のCPUのほとんどは32ビットまたは64ビット幅のレジスタを持っているため、保持できるサイズまでの任意の値で計算を行うことができます。値が小さい場合、特別なレジスタは必要ありません。レジスタの一部のみを使用するように指示する特別なASM命令を使用するだけです。そして、両手だけの大工のように、レジスターは一度に少量のデータしか保持できませんが、それらは再利用でき、アクティブなデータを入出力します。つまり、「多くのレジスター」は最終的に必要になります。(もちろん、多くのコードを用意しておけば、コンパイラはより高速なコードを生成できますが、厳密に必要というわけではありません。)


26
そして、町の向こうの倉庫にあるもの(ディスク)と彼がFedexに入れることができる他のもの(ネットワーク):
ダンピチェルマン

2
問題のシステムアーキテクチャに大きく依存します。
ワールドエンジニア

5
16ビットx86プロセッサの@Bineroには、Ax、Bxなどの名前のレジスタがあります。32ビットプロセッサに移行すると、レジスタが32ビットEAx、EBxに拡張されます。Axにアクセスすると、下位16ビットのEAxが得られます。64ビットモードでは、下位32ビットがEAxで下位16ビットがまだAxであるレジスタをRAxと名付けました。:あなたは16ビットアックスレジスタの上位バイトを取得するためにAHのようなバイトの他の部分に取得する方法を確認するためにこれらの図をチェックアウトen.wikipedia.org/wiki/X86#Structure
stonemetal

2
また、最近のCPUでは、レジスターがReally Fast Memoryのインコアバンクへの一時的なマッピングにすぎず、命令ストリームと予測された命令ストリームにどれだけ近いかに応じて変化するため、この種類も壊れます。
ヴァティーヌ

2
@MasonWheelerあなたの側の良い選択。
バティーン

3

実際には、CPU用語のレジスタは小さい名前付きメモリチャンクマイクロプロセッサ(CPU)内で使用可能、レジスタは特定の名前、サイズ、機能を持っています。たとえば、8085マイクロプロセッサが8ビットプロセッサで8 -ビットレジスタ(A:アキュムレータ、B、C、D、E、H、およびLレジスタと1つのフラグレジスタはすべて8ビットです)。2つの16ビットレジスタPCおよびSPはすべて特別な機能を備えており、アセンブリプログラミング中に機能が現れます。プログラマ以外のレジスタ制御はほとんどありません。

別のプロセッサを使用する場合、レジスタは異なります。8086は16ビットプロセッサであり、AX、BX、CXおよびDXはすべて16ビット、PC、SPおよびフラグレジスタです。

あなたが質問で引用したように、それらはプログラムの実行を高速化し、プロセッサキャッシュとして機能しますが、プロセッサアーキテクチャが変更され、プロセッサキャッシュを呼び出す多くのメモリを追加しました

ただし、プロセッサ(CPU)キャッシュとプロセッサ(CPU)レジスタ、メモリポインタ、プログラムステータスなどのような特別なアクティビティに実際に必要なレジスタにはわずかな違いがあります。 SP:スタックメモリ内のメモリポインタとして機能するスタックポインタ。また、アキュムレータは、算術演算のALUにアクセスするためのバッファおよびメインレジスタです

メーソン・ウィーラーの説明の例を見ることができます


1

レジスターはメモリーではなく、そのように考えるべきではないと考えるのが役立つと思います。

OOのように考える-RegisterはMemoryから派生したクラスではなく、Memoryはregisterから派生したクラスではありませんが、Registerクラスにはデータをメモリとの間で変換するメソッド(Machine Op Codes)があります。一方、メモリーはレジスターについて何も知らないため、レジスターに対するアクションを呼び出すことはできません。その結果、すべてのCPU操作は、多くの場合メモリにアクセスするレジスタによって実行されます。

書き込み専用レジスタを見るのは珍しくありません-ほとんどメモリの属性ではありません。また、レジスタ値を書き込むことなく変更することも可能です-繰り返しますが、メモリに期待する動作ではありません。


メモリマップドI / Oでは、「メモリ」の書き込み専用領域はそれほど珍しくありません。
SKロジック

@ SK-logic-正しい-しかし、質問の文脈は、OPがメモリをあなたが読み書きする何かとして考えていることを明確に尋ねました。彼をさらに混乱させる必要はありません:)
mattnz

0

@Mason Wheelerの回答は正確でしたが、あなたの質問を別の観点に置くことは可能だと思います。あなたの質問から判断すると、キャッシュとレジスタの違いを完全に理解するために必要な概念はデータパスです。Masonが適切に指摘したように、CPUのロジック(つまり、そのデータパス)は、メモリ情報をCPUが直接処理できないように設計されているため、レジスタが存在します。実際、CPUは、その命令が最初に適切なレジスタ(通常は「Instruction Register」という名前のレジスタ)にロードされなかった場合、実行中のプログラムの現在の命令をデコードすることさえできません。

これは、CPUの配線方法に関連しています。メモリとALUの間に物理的なパスはありません。ALUに供給されるすべてのデータは、何らかのレジスタで何らかの形でバッファリングする必要があります。異なる場合もありますが、メモリをALUに直接接続するために必要な回路は複雑すぎます。前述のデータパスによって決定されるように、メモリとALU間のすべての通信をレジスタファイルを介して仲介する方が簡単かつ効率的です。実際、特定の命令がメモリ位置をオペランドとして指定している場合でも(直接アドレス指定と呼ばれるアドレス指定モード)、対応するデータユニットはMBR(メモリバッファレジスタ、MDR、メモリデータバッファとも呼ばれる)と呼ばれるレジスタにロードされます。 )。

CPUの観点からは、情報(データまたはコード)がメインメモリまたはキャッシュからのものであるかどうかは実際には関係ありませんが、後者ははるかに高速であることに注意してください。キャッシュはパフォーマンス上の理由で存在し、レジスタはCPUの設計(データパス)のために存在します。賢いプログラマー(実際には賢いコンパイラー)は、メモリーアクセスを最小限に抑えるためにレジスターの使用を最大限にしようとします(レジスターはキャッシュまたはメモリーよりも高速です)。レジスタに保存された情報は複数回使用される傾向があるため、これは正当化できます。実際、これはRISC哲学の原則の1つです。

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