web-dev-qa-db-ja.com

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

この質問はしばらくの間私を悩ませてきました、そして今日私は私がそれをググると思った。私はそれについていくつか読みました、そしてそれは私がいつもプロセッサーとして知っていたもの cache に非常に似ていたようです。

両者に違いはありますか、それとも同じだと思うのは正しいですか。レジスターが実際に動作するためには、CPU内にある必要がありますか?

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

29
Jeroen

それらはまったく同じではありません。レジスタは、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命令を使用するだけです。そして、両手だけの大工のように、レジスターは一度に少量のデータしか保持できませんが、それらは再利用でき、アクティブなデータをそれらの内外に渡します。つまり、「多くのレジスター」は最終的に必要とされる。 (もちろん、多くのものが利用可能であれば、コンパイラーはより高速なコードを生成することができますが、それは必ずしも必要ではありません。)

62
Mason Wheeler

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

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

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

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

メイプルウィーラーの解説が説明されています。

3

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

OO-レジスタはメモリから派生したものではなくクラスであり、メモリはレジスタから派生したものではないクラスですが、レジスタクラスにはメソッド(マシンOp =コード)を使用して、データをメモリとの間で変換します。一方、メモリは、レジスタについて何も認識しておらず、アクションを呼び出すことができません。その結果、すべてのCPU操作は、メモリにアクセスすることが多いレジスタによって実行されます。

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

1
mattnz

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

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

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