解決すべき問題
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2019/06/02 00:56 UTC 版)
「レジスタ・リネーミング」の記事における「解決すべき問題」の解説
プログラムは、何らかの値に何らかの操作をする命令が並んだものである。命令がそれらの値を区別するために、それぞれの値に名前をつける。たとえば、「X と Y を足して、結果を Z に置く」という命令では、X、Y、Zが格納場所の名前である。 命令をコンパクトにまとめるため、多くのプロセッサの命令セットでは直接名前を指定でき、かつ高速に読み書きできる特別な場所を少しだけ用意している。これをレジスタと呼ぶ。 たとえば、x86命令セットアーキテクチャでは8個の整数レジスタがあり、x86の64ビット版(AMD64)では16個、PowerPCや多くのRISCでは32個、そしてIA-64では128個用意している。小さなプロセッサでは、これらの場所の名前は直接レジスタファイルの中の場所に対応している。 一方、命令の種類が違えば、その処理にかかる時間も異なる。たとえばプロセッサはメモリからロードしようとしている間に何百という命令を実行できるかもしれない。短い命令を時間のかかるロードを待っている間に行うと、命令がプログラムが本来指定している順番とは違った順番で進行していることになる。このようなアウト・オブ・オーダー実行は性能向上のために最近の高性能CPUでよく行われている。 上述を踏まえ、以下のようなコードをアウト・オブ・オーダー実行CPUで動作させることを考える。 レジスタ・リネーミング適用前#命令オペレーション1ロード メモリ1024番地からレジスタ1へ 2加算 レジスタ1へ 数値 2 を加算 3ストア レジスタ1の内容を1032番地へ 4ロード 2048番地からレジスタ1へ 5加算 レジスタ1へ 数値4 を加算 6ストア レジスタ1の内容を2056番地へ #4, 5, 6 の命令は #1, 2, 3 の命令とはやろうとしていることに依存関係はない。しかし、命令#4 は命令#3 が完了しないと実行できない。さもなくば、命令#3 は間違った値を書き込んでしまうかもしれないからである。具体的には、レジスタ1の内容が、命令#3で読み取っている最中に 命令#4で書き換えられてしまう可能性がある。 これは、レジスタの名前を変えるだけで解決可能である。 レジスタ・リネーミング適用後#命令オペレーション1ロード メモリ1024番地からレジスタ1へ 2加算 レジスタ1へ 数値 2 を加算 3ストア レジスタ1の内容を1032番地へ 4ロード 2048番地からレジスタ2へ 5加算 レジスタ2へ 数値4 を加算 6ストア レジスタ2の内容を2056番地へ これで命令#4,5,6 と命令#1,2,3は並行して実行できるようになり、プログラムが高速化される。 レジスタ・リネーミングで並行実行可能に成る#命令(X)オペレーション(X)命令(Y)オペレーション(Y)1ロード メモリ1024番地からレジスタ1へ NOP (メモリからの読み出しは並行実行不可) 2加算 レジスタ1へ 数値 2 を加算 ロード 2048番地からレジスタ2へ 3ストア レジスタ1の内容を1032番地へ 加算 レジスタ2へ 数値4 を加算 4NOP 休止 ストア レジスタ2の内容を2056番地へ 可能ならば、コンパイラはこの種のリネーミングを行う工夫を行う。しかしレジスタ数はどのプロセッサでも少ないため、コンパイラ(ソフトウェア)でできることは限られる。 多くの高性能CPUは、公開されている仕様より多くの実レジスタを持っていて、レジスタをいわば仮想化し 命令が示すレジスタと実レジスタの対応をハードウェアで動的に切り替えて( レジスタ リネーミングして )いる。このようなリネーミングにより並列性を高めている。
※この「解決すべき問題」の解説は、「レジスタ・リネーミング」の解説の一部です。
「解決すべき問題」を含む「レジスタ・リネーミング」の記事については、「レジスタ・リネーミング」の概要を参照ください。
- 解決すべき問題のページへのリンク