読み込み中...命令セット(めいれいせっと、instruction set)は、プログラマから見たコンピュータ・アーキテクチャを指す言葉で、データ型、命令、レジスタ、アドレッシングモード、メモリアーキテクチャ、割り込みと例外処理、(もしあれば)入出力などから構成される。命令セットアーキテクチャ (instruction set architecture, ISA) とも言う。
ISAは、CPUに実装された命令形式を二進数のコード(オペコード)のセットで表現したものである。オペコードのセットは、機械語とも呼ばれる。
例えば、インテルのPentiumとAMDのAthlonは、実装しているx86命令セットはほとんど同じだが内部設計は全く異なる。
この概念を拡大したユニークなISAとしてTIMI (Technology-Independent Machine Interface) があり、これはシステム/38とAS/400で使われている。TIMIは最近では仮想機械として知られるソフトウェアで実現されている。これはプラットフォームとそこで動作するアプリケーションの寿命を延ばすために設計されたもので、プラットフォーム全体を全く異なるハードウェアに移行してもTIMI自身だけを移植すれば、その上のオペレーティングシステムもアプリケーションもそのまま動作する。このためIBMはAS/400のハードウェアを古いCISCからPOWERに移行させたが、OSを含めたソフトウェアは全く変更せずに済んだ。
今日、新たなISA(あるいはマイクロアーキテクチャ)を開発しようとするベンダーはソフトウェアエミュレータを作って、ハードウェアが完成する前にソフトウェア開発者が開発に取り掛かることができるようにするのが一般的である。
命令セット設計では、一部のオペコードをソフトウェア割り込みに利用する。例えば、MOS 6502 では 0x00、Z80 では 0xFFGanssle, Jack. "Proactive. 2001年2月26日、MC68000では 0xA000 から 0xAFFFがソフトウェア割り込みに使われた。
Popek と Goldberg の仮想化要求仕様(Popek and Goldberg virtualization requirements)に適合した命令セットでは、高速な仮想機械の実装が容易になる。
複数プロセッサを搭載するシステムでは、命令セットでフェッチ・アンド・アッド、LL/SC、コンペア・アンド・スワップなどの機能をサポートすることで排他制御の実装が容易になる。
初期のコンピュータでは、メモリは高価で容量が少なかったため、メモリ上のプログラムのサイズを削減することが重要な課題であった。そのため、ある作業をするのに要する命令列のサイズを「コード密度; code density」と呼び、命令セットの重要な特性の1つとしていた。コード密度の高い命令セットでは、1つの命令で一度にいくつもの機能を実行できるようになっている。そのような複雑な命令セットを持つコンピュータ(CISC)では、基本的な操作(加算、乗算、サブルーチンへの分岐など)に加えて、メモリアクセス、レジスタのインクリメントといった操作を同時に行う。ソフトウェア実装の命令セットではさらに複雑な命令も存在する。
RISCは、メモリの低価格化に伴って登場した考え方であり、命令セットを単純化することでコード密度は低下する。RISCでは、各命令はレジスタ同士の加算などといった単純な操作しか行わない。
MISC(Minimal Instruction Ser Computer)はスタックマシンの一種であり、命令数は非常に少なく(16から64種)、1ワードに複数の命令を格納可能となっている。MISCの実装にはチップ面積はごく小さくて済み、FPGA やマルチコアでの実装に適している。コード密度はRISCと同程度である(メモリ当たりの命令密度は増加しているが、命令数が少ないため、より多くの命令実行を必要とする)。例えば、FORTH言語を実装したチップがあるhttp://www.ultratechnology.com/chips.htm。
命令セットの分類方法として、最も複雑な命令のオペランド数で分類する方法がある(以下で、a、b、c はメモリアドレス、reg1 などはレジスタを意味する)。コード密度を改善する機構として実行ファイル圧縮が研究されてきた。関連する数学上の概念としてコルモゴロフ複雑性がある。
このような単純な命令を組み合わせてより複雑な操作を構築し、(ノイマン型であれば)これを逐次的に実行したり、制御フロー命令で順序を変えたりする。
多くの命令セットに共通な操作として、以下のものがある。最近普通に実装されるようになった複雑な命令として、SIMD(Single-Instruction Stream Multiple-Data Stream)命令またはベクター命令がある。これは、同じ演算操作を複数のデータに同時に行うものである。SIMD によって大きなベクトルや行列の操作を短時間で行うことが可能となる。また、音声、画像、動画などの並列化されたアルゴリズムを高速に実行できる。SIMD の実装には様々なマーケティング上の名称がつけられている(MMX、3DNow!、AltiVecなど)。
命令セットの設計は複雑な問題である。マイクロプロセッサの歴史は命令セットの設計で2つの段階に分けられる。当初、CISC すなわち複雑な命令セットが実装されていた。1970年代、IBMなどで研究が行われ、多くの命令が省略可能であることが判明した。その結果 RISC すなわち縮小された命令セットが登場した。命令セットが縮小されることで、クロックを高速化でき、プロセッサのサイズを小さくでき、電力消費を低減させることが可能となった。極端なRISCでなくとも、典型的な操作を最適化し、メモリやキャッシュの効率を向上させ、プログラミングを単純化させることができる。
ISAのカスタマイズも非常によく見られる。
読み込み中...