応用科学
直交命令セット
コンピューター工学では、 直交命令セットは、すべての命令タイプがすべてのアドレッシングモードを使用できる命令セットアーキテクチャです。命令タイプとアドレッシングモードが独立して変化するという意味で、「直交」です。直交命令セットは特定のレジスタを使用するために特定の命令を必要とする制限を課さないため、命令機能の重複はほとんどありません。
直交性は、1970年代にプロセッサ設計者の主要な目標と見なされ、VAX-11はこの概念のベンチマークとしてよく使用されます。ただし、1980年代にRISC設計哲学が導入されたことで、直交性が高まる傾向が大幅に逆転しました。最近のCPUは、RISCのようなコアで実際のタスクを実行する前に、多くの場合、前処理ステップで直交性をシミュレートします。
基本概念
コアでは、すべての汎用コンピューターが同じ基本的な方法で動作します。メインメモリに保存されたデータは、中央処理装置(CPU)によって読み取られ、処理された後、メモリに書き戻されます。メモリーは、数値としてエンコードされ、 アドレス 、また数値によって参照されるデータ値のコレクションで構成されます。これは、データに適用されるのと同じ操作をアドレス自体に適用できることを意味します。作業中、データはプロセッサレジスタに一時的に保持され、スクラッチパッドの値に非常にすばやくアクセスできます。レジスタは、たとえば、数値の文字列を合計に加算するときに使用されます。
初期のコンピューターでは、命令セットアーキテクチャ(ISA)はしばしば単一のレジスターを使用していました。この場合、 アキュムレーターと呼ばれていました。命令には、オペランドのアドレスが含まれていました。たとえば、ADD アドレス命令は、CPUがそのアドレスで見つかったメモリ内の番号を取得し、それをすでにアキュムレータにある値に追加します。この非常に単純な例のISAには、各命令にデータのアドレスが含まれているため、「1アドレス形式」があります。
1アドレスマシンには、追加などの単純なアクションでも複数の命令が必要であり、各命令でメモリが不足し、読み取りに時間がかかるという欠点があります。 5 + 4の2つの数字を追加する簡単なタスクを考えます。この場合、プログラムはLOAD アドレス命令でアキュムレーターに値5をロードし、4のアドレスを指すADD アドレス命令を使用し、最後に結果を保存するためのSAVE アドレス 、9、別のメモリロケーションに戻ります。
単一の命令で両方のオペランドのアドレス 、たとえばADD アドレス1 、 アドレス2を提供することにより、さらに改善することができます。このような「2アドレス形式」ISAは非常に一般的です。さらに、SAVEも展開されたADD アドレス1 、 アドレス2 、 resultのアドレスにフォールドされる「3アドレス形式」に概念を拡張できます。
多くの場合、基本的なコンピューターワードは、命令とアドレスだけを保持するのに必要なものよりもはるかに大きく、ほとんどのシステムでは、アドレスの代わりに定数を保持するために使用できる残りのビットがあります。オペランドのいずれか1つを定数に置き換えることができる場合、命令をさらに改善できます。たとえば、ADD アドレス1 、 定数1は1つのメモリサイクルを削除し、ADD 定数1 、 定数2は別のメモリサイクルを削除します。
メモリにアクセスする一般的なパターンを考慮すると、さらに複雑になります。非常に一般的なパターンの1つは、単一の操作を大量の類似データに適用できることです。たとえば、1,000個の数字を追加する場合があります。単純な2アドレス形式では、アドレスを変更する方法がないため、1,000個の追加を機械語で記述する必要があります。 ISAは、 間接アドレス指定の概念でこの問題を修正します。 間接アドレス指定では、データの次のポイントのアドレスは定数ではなく、それ自体がメモリに保持されます。これは、プログラマがそのメモリ位置で追加を実行することによりアドレスを変更できることを意味します。 ISAには、多くの場合、レジスタの1つ(場合によっては特別なインデックスレジスタ)に保持されている値を追加することにより、初期位置からアドレスをオフセットする機能も含まれています。他の人は、それを使用する指示の一部としてこの追加を自動的に実行します。
さまざまなアドレス指定モードにより、わずかに異なる命令が大量に発生します。単一の命令であるADDでさえ、1アドレスのISAを考えると、多くの可能な「アドレッシングモード」があります。
即時(定数):ADD.C 定数1-アキュムレーターの結果に定数値を追加します
直接アドレス:ADD.A アドレス 1- アドレス1に格納されている値を追加します
メモリ間接:ADD.M アドレス 1- アドレス1の値を読み取り、その値を別のアドレスとして使用し、その値を追加します
多くのISAには、アドレス指定や数学タスクに使用できるレジスタもあります。単一のアドレスレジスタを使用する場合、これは1アドレス形式で使用できます。この場合、いくつかの新しいモードが利用可能になります。
直接登録:ADD.R レジスタ 1- レジスタ1に保持されているアドレスに格納されている値を追加します
変位:ADD.D 定数1-定数をアドレスレジスタに追加し、その結果の場所でメモリにある値を追加します。
インデックス:ADD.I レジスタ 1- レジスタ1の値をアドレスレジスタに追加して新しいアドレスを作成し、その場所の値をアキュムレータに追加します。
自動インデックス:ADD.AI レジスタ1-インデックスの場合と同様ですが、アドレスを自動的にインクリメントします
直交性
直交性は、すべての命令がサポートされているアドレス指定モードを使用できる必要があるという原則です。この例では、ADDの直接アドレス指定バージョンが使用可能な場合、他のすべても同様に使用できます。この設計の理由は審美的ではなく、目標はプログラムのオブジェクトコードの合計サイズを減らすことです。さまざまなアドレッシングモードを提供することにより、ISAはプログラマーがその時点でのプログラムのニーズに正確に一致するものを選択できるようにし、それによって同じ目的を達成するために複数の命令を使用する必要性を減らします。これは、命令の総数が削減され、メモリの節約とパフォーマンスの向上の両方が行われることを意味します。直交性は、非常に「ビット効率が高い」とよく言われました。
直交設計の究極の目的は、あらゆる命令があらゆるタイプのアドレスを使用できるようにすることであるため、多くの場合、直交性の実装は、プロセッサの部分間に配線を追加するだけの場合です。ただし、それは命令デコーダーの複雑さ、プログラムカウンターによって指定された場所でメモリから命令を読み取り、それを処理する方法を決定する回路にも追加されます。
上記のISAの例では、直接エンコードを使用するADD.C命令には、命令を実行するために必要なデータが既にあり、デコーダーは値を算術論理ユニット(ALU)に送信するだけです。ただし、ADD.A命令を使用する場合、アドレスを読み取り、そのメモリ位置の値を読み取ってから、ALUを続行できます。この一連のイベントは完了するまでにはるかに時間がかかり、より多くの内部手順が必要です。
その結果、命令のさまざまなバリエーションを完了するのに必要な時間は大幅に異なる可能性があり、CPU設計全体が複雑になります。したがって、直交性は設計のトレードオフを表します。コンピュータ設計者は、CPUをより複雑にすることを犠牲にしてコード密度を改善するために、より多くのアドレッシングモードをプログラマに提供することを選択できます。
特にドラムメモリやコアメモリの時代に、メモリが小さく高価であった場合、直交性が非常に望ましいものでした。ただし、多くの場合、複雑さは現在の技術を使用して達成できるものを超えていました。このため、1960年代のほとんどのマシンは、設計者が余裕がある限り、部分的な直交性のみを提供していました。 1970年代に大規模な統合が導入され、コンピューター設計の複雑さが大幅に軽減され、完全に直交する設計が出現し始めました。 1980年代までに、そのような設計はシングルチップCPUに実装できました。
1970年代後半、最初の強力な完全直交設計が登場したため、目標は、高レベル言語コンピューターアーキテクチャ(略してHLLCA)になるまで広がりました。機械語のビット密度を改善するために直交性が望まれたように、HLLCAの目標はALGOL 68などの高レベル言語のビット密度を改善することでした。これらの言語は一般に、通常、ISAは直接サポートせず、基礎となるISAからの多くの個別の命令を使用して実装する必要がありました。これらの構造のサポートを追加すると、プログラムをより直接ISAに変換できるようになります。
実際の直交性
PDP-11
浮動小数点命令を除いて、PDP-11は非常に強く直交していました。すべての整数命令は、1バイトまたは2バイトの整数で動作し、レジスタに格納されたデータ、命令の一部として格納されたデータ、メモリに格納されたデータ、またはメモリに格納されレジスタ内のアドレスが指すデータにアクセスできます。 PCとスタックポインターでさえ、すべての通常のデータモードを使用する通常の命令の影響を受ける可能性があります。 「中間」モード(ADD#4、R1(R1 = R1 + 4など)の命令内のハードコードされた数値は、「レジスタ間接、自動インクリメント」モードとして実装され、使用するレジスタとしてプログラムカウンタ(R7)を指定します。インダイレクションおよび自動インクリメントへの参照。
PDP-11はオクタル指向(3ビットのサブバイト)マシン(アドレス指定モード0〜7、レジスタR0〜R7)であったため、(電子的に)8つのアドレス指定モードがありました。参照可能なレジスタとしてスタックポインター(R6)およびプログラムカウンター(R7)を使用することにより、10の概念的なアドレッシングモードが利用可能になりました。
VAX-11
VAX-11は、PDP-11の直交性を、浮動小数点数を含むすべてのデータ型に拡張しました。 「ADD」などの命令は、ADDDB、ADDW、ADDL、ADDP、ADDDF、ADDB、ADDB、ADDB、パックドBCD、単精度浮動小数点などのデータサイズ依存バリアントにそれぞれ分割されました。 PDP-11と同様に、スタックポインターとプログラムカウンターは汎用レジスタファイル(R14とR15)にありました。
VAX-11命令の一般的な形式は次のとおりです。
オペコード...各コンポーネントは1バイト、オペコードは0〜255の範囲の値、2つのニブルで構成される各オペランド、アドレッシングモードを指定する上位4ビット、およびレジスタ番号(R0〜R15)を指定する下位4ビット(通常) )。
8進指向のPDP-11とは異なり、VAX-11は16進指向のマシン(4ビットのサブバイト)でした。これにより、16の論理アドレッシングモード(0〜15)が発生しましたが、アドレッシングモード0〜3は、6ビット以下のイミディエイトデータに対して「ショートイミディエイト」でした(アドレッシングモードの下位2ビットは上位2そのデータアドレス指定バイトの残りの4ビットの前に追加された場合の、即時データのビット)。アドレッシングモード0〜3は同一であったため、13(電子)アドレッシングモードになりましたが、PDP-11と同様に、スタックポインター(R14)とプログラムカウンター(R15)を使用して合計15を超える概念アドレッシングモードが作成されました。 (ソースコードを実際のスタックポインターまたはプログラムカウンターベースのアドレス指定モードに変換するアセンブラープログラムが必要です)。
MC68000など
Motorolaの設計者は、アセンブリ言語を直交化しようとしましたが、基礎となる機械語はそうではありませんでした。 PDP-11とは異なり、MC68000(68k)は個別のレジスタを使用してデータとデータのアドレスをメモリに保存しました。 ISAは、これらのレジスタでのみアドレスを使用できる範囲と直交していましたが、異なる命令で使用できるレジスタに制限はありませんでした。同様に、データレジスタも命令間で直交していました。
対照的に、NS320xxシリーズはもともとVAX-11 ISAのシングルチップ実装として設計されました。これは法的な問題のために変更する必要がありましたが、結果のシステムはVAX-11の全体的な設計哲学の多くを保持し、完全に直交したままでした。これには、68kにある個別のデータおよびアドレスレジスタの削除が含まれます。
8080以降の設計
8ビットIntel 8080(および8085および8051)マイクロプロセッサは、基本的にわずかに拡張されたアキュムレータベースの設計であったため、直交していませんでした。アセンブリ言語のプログラマーまたはコンパイラーライターは、各レジスタで可能な操作を意識する必要がありました。ほとんどの8ビット操作は8ビットアキュムレータ(Aレジスタ)でのみ実行でき、16ビット操作は16ビットポインタ/アキュムレータ(HLレジスタペア)でのみ実行されますが、インクリメントなどの単純な操作は、7つの8ビットレジスタすべてで可能です。これは主に、すべてのオペコードを1バイト長にしたいという要望によるものです。
バイナリ互換のZ80は、この1バイトの制限を回避し、より強力な命令セットを可能にするプレフィックスコードを後で追加しました。同じ基本的な考え方がIntel 8086にも採用されましたが、より根本的な拡張を可能にするために、8080とのバイナリ互換性はここでは試みられませんでした。当時の高いコード密度のために、ある程度の非直交性を維持していました)。 80386で導入されたこのアーキテクチャの32ビット拡張は、8086命令とそれに対応する拡張命令をすべて保持しているにもかかわらず、やや直交的でした。ただし、使用されているエンコード戦略では、8008および8080(およびZ80)からの多くのトレースが引き続き表示されます。たとえば、レジスタおよび定数のプッシュおよびポップなどの特定の頻繁な操作に対しては、シングルバイトエンコーディングが残ります。プライマリアキュムレータであるEAXレジスタは、特定のタイプの操作で他のレジスタよりも短いエンコードを使用します。このような観察は、コンパイラと手書きコードの両方でコードの最適化のために悪用されることがあります。
RISC
1970年代までの多くの研究は、直交モードによって提供される柔軟性が実際の問題で使用されることはほとんどないか、まったく使用されないことを示しました。特に、IBMの取り組みでは、System / 370で実行されるコードのトレースを調査し、実際のプログラムで使用できるモードのごく一部しか使用されていないことを実証しました。多くの場合VAXに関する同様の研究は、同じパターンを示しました。場合によっては、命令の複雑さにより、一連の小さな命令よりも実行に時間がかかることが示されました。これの標準的な例は、VAXのINDEX命令です。
この同じ時期に、半導体メモリは急速にサイズが大きくなり、コストが減少しました。ただし、同じ速度で速度が向上することはありませんでした。これは、CPUの速度と比較して、メモリからデータにアクセスするのに必要な時間が相対的に増加していることを意味していました。これは、より多くのレジスタを含めることを主張し、CPUに使用する一時的な値を増やします。レジスタの数が多くなると、レジスタ番号をエンコードするためにコンピュータワードのビット数が多くなり、命令自体の数を減らして空き容量を増やすことが示唆されました。
最後に、Andrew Tanenbaumの論文は、プログラムのすべての定数の97%が0から10の間であり、0は合計の20から30%を表すことを実証しました。さらに、プログラム内のすべての値の30〜40%は定数であり、単純な変数(配列などとは対照的に)がさらに35〜40%です。プロセッサが32ビットなどのより大きな命令語を使用する場合、命令自体が多すぎるビットを使用しない限り、2つの定数とレジスタ番号を1つの命令にエンコードできます。
これらの観察は、プロセッサ設計の主要な目標としての直交設計の放棄と、1980年代のRISC哲学の台頭につながりました。 RISCプロセッサには通常、直接(定数)とレジスタの2つのアドレス指定モードしかありません。古いプロセッサにある他のすべてのモードは、レジスタ間でデータを移動するロードおよびストア命令を使用して明示的に処理されます。使用できるアドレス指定モードはわずかであり、これらのモードは、命令がデータを参照するか、制御の転送を伴うかによって異なる場合があります。
ノート
- ^デジタル化を参照してください。
- ^最新のコンピューターでも、限られたリソースであるキャッシュにデータを保持することでパフォーマンスが最大化されます。