
電子工学、コンピュータ科学、コンピュータ工学において、マイクロアーキテクチャ(コンピュータ構成とも呼ばれ、 μarchまたはuarchと略されることもある)は、特定のプロセッサで特定の命令セットアーキテクチャ(ISA)を実装する方法である。[ 1 ]特定のISAは、異なるマイクロアーキテクチャで実装される可能性がある。[ 2 ] [ 3 ]実装は、特定の設計の異なる目標や技術の変化によって異なる場合がある。[ 4 ]
コンピュータアーキテクチャとは、マイクロアーキテクチャと命令セットアーキテクチャを組み合わせたものである。

ISAは、アセンブリ言語プログラマやコンパイラ開発者から見たプロセッサのプログラミングモデルとほぼ同じです。ISAには、命令、実行モデル、プロセッサレジスタ、アドレスおよびデータフォーマットなどが含まれます。マイクロアーキテクチャには、プロセッサの構成要素と、それらがどのように相互接続され、相互運用されてISAを実現するかが含まれます。
マシンのマイクロアーキテクチャは通常、マシンのさまざまなマイクロアーキテクチャ要素の相互接続を記述する(多かれ少なかれ詳細な)図として表現されます。これらの要素は、単一のゲートやレジスタから、完全な算術論理演算ユニット(ALU)、さらに大きな要素まで、あらゆるものを含みます。これらの図は一般的に、データパス(データが配置される場所)と制御パス(データを制御すると言える)を分離しています。 [ 5 ]
システムを設計する人は、通常、データフロー図の一種として特定のマイクロアーキテクチャを描きます。ブロック図と同様に、マイクロアーキテクチャ図は、演算論理ユニットやレジスタファイルなどのマイクロアーキテクチャ要素を単一の回路図記号として示します。通常、この図では、3ステートバス(バスを駆動する各デバイスに3ステートバッファが必要)、単方向バス(常に単一のソースによって駆動される。例えば、単純なコンピュータのアドレスバスは常にメモリアドレスレジスタによって駆動される) 、および個々の制御線を区別するために、矢印、太線、細線でこれらの要素を接続します。非常に単純なコンピュータは、単一のデータバス構成、つまり単一の3ステートバスを備えています。より複雑なコンピュータの図は通常、複数の3ステートバスを示しており、これによりマシンはより多くの演算を同時に実行できます。
各マイクロアーキテクチャ要素は、それを実装するために使用される論理ゲートの相互接続を示す回路図によって表されます。各論理ゲートは、特定の論理ファミリにおいてそれを実装するために使用されるトランジスタの接続を示す回路図によって表されます。異なるマイクロアーキテクチャを持つマシンでも、同じ命令セットアーキテクチャを持つ場合があり、そのため同じプログラムを実行できます。新しいマイクロアーキテクチャや回路ソリューション、そして半導体製造技術の進歩によって、新世代のプロセッサは同じISAを使用しながら、より高いパフォーマンスを実現できるのです。
原理的には、単一のマイクロアーキテクチャで、マイクロコードにわずかな変更を加えるだけで、複数の異なるISAを実行できる。

パイプラインデータパスは、今日のマイクロアーキテクチャで最も一般的に使用されているデータパス設計です。この技術は、最新のマイクロプロセッサ、マイクロコントローラ、およびDSPのほとんどで使用されています。パイプラインアーキテクチャでは、アセンブリラインのように、複数の命令が実行時にオーバーラップします。パイプラインには、マイクロアーキテクチャ設計の基本となるいくつかの異なるステージが含まれています。[ 5 ]これらのステージには、命令フェッチ、命令デコード、実行、およびライトバックが含まれます。一部のアーキテクチャには、メモリアクセスなどの他のステージが含まれます。パイプラインの設計は、マイクロアーキテクチャの中心的なタスクの1つです。
実行ユニットもマイクロアーキテクチャにとって不可欠です。実行ユニットには、算術論理演算ユニット(ALU)、浮動小数点演算ユニット(FPU)、ロード/ストアユニット、分岐予測、SIMDなどが含まれます。これらのユニットはプロセッサの演算や計算を実行します。実行ユニットの数、レイテンシ、スループットの選択は、マイクロアーキテクチャ設計における重要な課題です。システム内のメモリのサイズ、レイテンシ、スループット、接続性も、マイクロアーキテクチャ上の決定事項です。
メモリコントローラなどの周辺機器を含めるかどうかといったシステムレベルの設計上の決定は、マイクロアーキテクチャ設計プロセスの一部とみなすことができます。これには、これらの周辺機器の性能レベルや接続性に関する決定も含まれます。
特定の性能レベルの達成が主な目標となるアーキテクチャ設計とは異なり、マイクロアーキテクチャ設計では、その他の制約条件に重点が置かれます。マイクロアーキテクチャ設計の決定はシステムの構成に直接影響を与えるため、チップ面積/コスト、消費電力、ロジックの複雑さ、接続の容易さ、製造性、デバッグの容易さ、テストの容易さといった問題に注意を払う必要があります。
プログラムを実行するには、シングルチップまたはマルチチップのすべてのCPUが必要です。
電源が切れるまで、命令サイクルは連続的に繰り返される。
歴史的に見ると、初期のコンピュータはマルチサイクル設計でした。現在でも、最も小型で安価なコンピュータは、この手法を採用していることがよくあります。マルチサイクルアーキテクチャは、論理素子の総数を最小限に抑え、消費電力も抑えることができます。また、決定論的なタイミングと高い信頼性を実現するように設計できます。特に、条件分岐や割り込み処理時にパイプラインが停止することはありません。しかし、同じ論理ファミリを使用しても、単位時間あたりに実行できる命令数が多いマイクロアーキテクチャも存在します。「パフォーマンスの向上」について議論する場合、その向上は多くの場合、マルチサイクル設計との比較において行われます。
マルチサイクルコンピュータでは、コンピュータはクロックの複数のサイクルにわたって、4つのステップを順番に実行します。一部の設計では、メインサイクル外でより長い処理を実行する場合もあり、クロックのエッジを交互に切り替えることで、2つのクロックサイクルでこのシーケンスを実行できます。例えば、最初のサイクルの立ち上がりエッジでステージ1、最初のサイクルの立ち下がりエッジでステージ2を実行するなどです。
制御ロジックでは、サイクルカウンタ、サイクル状態(ハイまたはロー)、および命令デコードレジスタのビットの組み合わせによって、コンピュータの各部分が何を行うべきかが正確に決定されます。制御ロジックを設計するには、各命令の各サイクルでコンピュータの各部分への制御信号を記述するビットテーブルを作成できます。次に、このロジックテーブルをテストコードを実行するソフトウェアシミュレーションでテストできます。ロジックテーブルがメモリに配置され、実際のコンピュータを実行するために使用される場合、それはマイクロプログラムと呼ばれます。一部のコンピュータ設計では、ロジックテーブルは、通常、ロジックを最適化するコンピュータプログラムを使用して、論理ゲートから構成される組み合わせロジックの形式に最適化されます。初期のコンピュータは、モーリス・ウィルクスがこの表形式のアプローチを発明し、マイクロプログラミングと呼ぶまで、制御にアドホックなロジック設計を使用していました。 [ 6 ]
この一見単純な一連の手順を複雑にしているのは、キャッシュ、メインメモリ、ハードディスクなどの不揮発性ストレージ(プログラム命令とデータが格納される場所)を含むメモリ階層が、常にプロセッサ自体よりも遅いという事実です。手順(2)では、データがコンピュータバス経由で到着するまで、CPU の観点から長い遅延が発生することがよくあります。このような遅延をできるだけ回避する設計には、かなりの研究が費やされてきました。長年にわたり、中心的な目標は、より多くの命令を並列実行し、プログラムの実効実行速度を向上させることでした。これらの取り組みにより、複雑なロジックと回路構造が導入されました。当初、これらの技術は、必要な回路の量が多いため、高価なメインフレームまたはスーパーコンピュータでのみ実装できました。半導体製造が進歩するにつれて、これらの技術の多くが単一の半導体チップで実装できるようになりました。ムーアの法則を参照してください。
命令セットは長年にわたり、当初の非常に単純なものから、時には非常に複雑なものへと変化してきました(様々な点で)。近年では、ロードストアアーキテクチャ、VLIW、EPICタイプが流行しています。データ並列性を扱うアーキテクチャには、 SIMDやベクトルなどがあります。CPUアーキテクチャのクラスを示すために使用されるラベルの中には、特にCISCラベルのように、あまり説明的ではないものもあります。後付けで「CISC」と表記された初期の設計の多くは、実際には現代のRISCプロセッサよりも(いくつかの点で)かなり単純です。
しかし、命令セットアーキテクチャの選択は、高性能デバイスの実装の複雑さに大きく影響する可能性があります。最初のRISCプロセッサの開発に用いられた主要な戦略は、命令を個々の意味的複雑さを最小限に抑えつつ、高いエンコーディング規則性と単純性を実現することでした。このような均一な命令は、パイプライン方式で容易にフェッチ、デコード、実行でき、論理レベルの数を減らすというシンプルな戦略によって高い動作周波数を実現しました。命令キャッシュメモリは、高い動作周波数と本質的に低いコード密度を補い、大きなレジスタセットは、可能な限り多くの(低速な)メモリアクセスを排除するために使用されました。
パフォーマンスを向上させるための最初期かつ最も強力な手法の一つが、命令パイプライン処理の利用です。初期のプロセッサ設計では、次の命令に進む前に、上記の手順をすべて一つの命令に対して実行していました。そのため、回路の大部分がどの段階でもアイドル状態になっていました。例えば、命令デコード回路は実行中はアイドル状態でした。
パイプライン処理は、複数の命令を同時にプロセッサ内で実行できるようにすることで、パフォーマンスを向上させます。同じ基本的な例で言えば、プロセッサは前の命令が結果を待っている間に、新しい命令のデコード(ステップ1)を開始します。これにより、最大4つの命令を同時に実行できるため、プロセッサの処理速度が4倍になったように見えます。個々の命令の完了にかかる時間は変わりませんが(依然として4つのステップがあるため)、CPU全体としては命令の処理速度が大幅に向上します。
RISCは、命令処理の各段階を明確に分離し、それぞれに同じ時間(1サイクル)をかけることで、パイプラインを小型化し、構築をはるかに容易にします。プロセッサ全体は、命令が片側から入力され、結果が反対側から出力されるという、組み立てライン方式で動作します。従来のRISCパイプラインの複雑さが軽減されたため、パイプライン化されたコアと命令キャッシュを、CISC設計でコア単体を収めるのと同じサイズのダイに配置できました。これがRISCが高速だった本当の理由です。SPARCやMIPSのような初期の設計では、同じクロック速度と価格帯のIntelやMotorolaのCISCソリューションよりも10倍以上高速に動作することがよくありました。
パイプラインは決してRISC設計に限られたものではありません。1986年までに、最上位のVAX実装(VAX 8800)は、最初の商用MIPSおよびSPARC設計よりもわずかに早く、高度にパイプライン化された設計となっていました。現在、ほとんどの最新CPU(組み込みCPUでさえ)はパイプライン化されており、パイプライン化されていないマイクロコードCPUは、最も面積に制約のある組み込みプロセッサでのみ見られます。VAX 8800から最新のIntelおよびAMDプロセッサに至るまで、大規模なCISCマシンは、マイクロコードとパイプラインの両方を使用して実装されています。パイプライン化とキャッシングの改善は、プロセッサの性能が、その基盤となる回路技術の進歩に追いつくことを可能にした2つの主要なマイクロアーキテクチャ上の進歩です。
チップ製造技術の進歩により、ダイ上にさらに多くの回路を配置できるようになり、設計者はその活用方法を模索し始めた。最も一般的な方法の一つは、ダイ上にキャッシュメモリをますます多く追加することだった。キャッシュは非常に高速で高価なメモリである。メインメモリとの通信に必要な多くのサイクルとは異なり、キャッシュへのアクセスはわずか数サイクルで済む。CPUにはキャッシュコントローラが搭載されており、キャッシュからの読み書きを自動化する。データが既にキャッシュにある場合は、そこからアクセスされるため、大幅な時間短縮が実現する。一方、データがキャッシュにない場合は、キャッシュコントローラがデータを読み込む間、プロセッサは「停止」状態となる。
RISC設計では、1980年代半ばから後半にかけてキャッシュが追加され始めましたが、当初は 合計でわずか4KB程度でした。この容量は時間とともに増加し、現在では一般的なCPUは少なくとも2MBを搭載しています。より高性能なCPUでは、4MB、6MB、12MB、あるいは32MB以上を搭載するものもあり、新しくリリースされたEPYC Milan-Xシリーズでは、複数のレベルのメモリ階層で構成された768MBという最大容量を実現しています。一般的に、キャッシュ容量が大きいほど、ストールが減少するため、パフォーマンスが向上します。
キャッシュとパイプラインはまさに理想的な組み合わせだった。従来は、オフチップメモリのアクセスレイテンシよりも高速に動作するパイプラインを構築することはあまり意味がなかった。しかし、オンチップキャッシュメモリを使用することで、パイプラインをキャッシュアクセスレイテンシの速度、つまりはるかに短い時間で実行できるようになった。これにより、プロセッサの動作周波数をオフチップメモリよりもはるかに速いペースで向上させることが可能になった。
命令レベル並列処理によるパフォーマンス向上を阻む要因の一つは、分岐命令によるパイプラインの停止とフラッシュです。通常、条件分岐が実行されるかどうかは、パイプラインの後半まで分かりません。これは、条件分岐がレジスタからの結果に依存するためです。プロセッサの命令デコーダが条件分岐命令を検出してから、決定的なレジスタ値を読み出せるようになるまでの間、パイプラインは数サイクル停止する必要があります。停止しない場合、つまり分岐が実行された場合は、パイプラインをフラッシュする必要があります。クロック速度が上がるとパイプラインの深さも増し、最新のプロセッサの中には20段以上のものもあるかもしれません。平均すると、実行される命令の5つに1つは分岐命令なので、何らかの対策を講じなければ、停止回数が非常に多くなります。
分岐予測や投機的実行といった技術は、こうした分岐ペナルティを軽減するために用いられます。分岐予測とは、ハードウェアが特定の分岐が実行されるかどうかを推測するものです。実際には、分岐のどちらか一方が他方よりもはるかに頻繁に呼び出されます。最新の設計では、過去の分岐の結果を監視して将来をより正確に予測する、かなり複雑な統計的予測システムが採用されています。この推測により、ハードウェアはレジスタの読み出しを待たずに命令をプリフェッチできます。投機的実行は、予測されたパスに沿ったコードをプリフェッチするだけでなく、分岐が実行されるべきかどうかが判明する前に実行するという、さらなる機能強化です。推測が正しければパフォーマンスが向上しますが、推測が間違っていた場合は命令を取り消す必要があるため、大きなペナルティが発生するリスクがあります。
上記で概説した概念を支えるために必要な複雑さやゲート数の増加にもかかわらず、半導体製造技術の進歩により、さらに多くの論理ゲートが使用可能になった。
上記の概略図では、プロセッサは一度に1つの命令の一部ずつを処理します。複数の命令を同時に処理できれば、コンピュータプログラムはより高速に実行できます。スーパースカラプロセッサは、ALUなどの機能ユニットを複製することでこれを実現します。機能ユニットの複製が可能になったのは、単一発行プロセッサのダイ面積が、もはや信頼性の高い製造の限界を超えなくなった時でした。1980年代後半には、スーパースカラ設計が市場に出回り始めました。
現代の設計では、2つのロードユニット、1つのストアユニット(多くの命令は格納する結果を持たない)、2つ以上の整数演算ユニット、2つ以上の浮動小数点演算ユニット、そして多くの場合、何らかのSIMDユニットが一般的です。命令発行ロジックは、メモリから膨大な命令リストを読み込み、その時点でアイドル状態にあるさまざまな実行ユニットにそれらを渡すことで、複雑さを増していきます。そして最後に、結果が収集され、並べ替えられます。
キャッシュを追加することで、メモリ階層からデータがフェッチされるのを待つことによるストールの頻度や期間を減らすことができますが、これらのストールを完全に解消することはできません。初期の設計では、キャッシュミスが発生すると、キャッシュコントローラがプロセッサを停止させて待機させる必要がありました。もちろん、その時点でキャッシュにデータが利用可能なプログラム内の他の命令が存在する可能性があります。アウトオブオーダー実行では、キャッシュを待機している古い命令がある間に、準備のできた命令を処理し、結果を並べ替えることで、すべてがプログラムされた順序で実行されたように見せかけます。この手法は、長いレイテンシの浮動小数点演算やその他のマルチサイクル演算の結果を待つ命令など、他のオペランド依存性によるストールを回避するためにも使用されます。
レジスタリネーミングとは、プログラム命令が同じレジスタを再利用することによって発生する、不要な直列実行を回避するために使用される手法です。同じレジスタを使用する2つの命令グループがあるとします。一方の命令セットが先に実行されてレジスタがもう一方の命令セットに渡されますが、もう一方の命令セットが別の類似のレジスタに割り当てられている場合、両方の命令セットを並列(または直列)に実行できます。
コンピュータ設計者は、CPUの動作周波数とDRAMのアクセス時間の不一致が拡大するにつれて、行き詰まりを感じるようになった。単一プログラム内で命令レベル並列性(ILP)を活用する手法はどれも、メインメモリからデータをフェッチする際に発生する長い停止時間を補うことができなかった。さらに、より高度なILP手法に必要なトランジスタ数の多さと高い動作周波数は、もはや安価に冷却できないほどの電力消費量を必要とした。こうした理由から、新世代のコンピュータは、単一のプログラムやプログラムスレッドの外に存在する、より高度な並列性を活用し始めている。
この傾向は、スループットコンピューティングと呼ばれることもあります。この考え方は、メインフレーム市場で生まれました。当時のオンライン・トランザクション処理では、個々のトランザクションの実行速度だけでなく、膨大な数のトランザクションを処理する能力が重視されていました。過去10年間で、ネットワークルーティングやウェブサイト配信といったトランザクションベースのアプリケーションが大幅に増加したことで、コンピュータ業界は再び処理能力とスループットの問題を重視するようになりました。
並列処理を実現する手法の一つとして、マルチプロセッシングシステム、すなわち複数のCPUを搭載したコンピュータシステムが挙げられる。かつてはハイエンドのメインフレームやスーパーコンピュータ専用だった小規模(2~8)マルチプロセッササーバーは、中小企業市場で広く普及している。大企業向けには、大規模(16~256)マルチプロセッサが一般的だ。 1990年代以降は、複数のCPUを搭載したパーソナルコンピュータも登場している。
半導体技術の進歩によりトランジスタサイズのさらなる縮小が可能になったことで、同じシリコンチップ上に複数のCPUを実装したマルチコアCPUが登場しました。当初は、よりシンプルで小型のCPUで複数のインスタンスを1枚のシリコンチップに収めることができる組み込み市場向けのチップで使用されていました。2005年までに、半導体技術の進歩により、デュアルハイエンドデスクトップCPU CMPチップが量産されるようになりました。Sun MicrosystemsのUltraSPARC T1などの一部の設計では、 1枚のシリコンチップにより多くのプロセッサを収めるために、よりシンプルな(スカラー、インオーダー)設計に戻っています。
近年人気が高まっているもう一つの技術はマルチスレッド処理です。マルチスレッド処理では、プロセッサが低速なシステムメモリからデータを取得する必要がある場合、データが到着するまで待機するのではなく、実行準備が整っている別のプログラムまたはプログラムスレッドに切り替えます。これは特定のプログラム/スレッドの速度を向上させるものではありませんが、CPUのアイドル時間を短縮することでシステム全体の処理速度を向上させます。
概念的には、マルチスレッド処理はオペレーティングシステムレベルでのコンテキストスイッチに相当します。違いは、マルチスレッドCPUは、通常のコンテキストスイッチに必要な数百から数千のCPUサイクルではなく、1つのCPUサイクルでスレッド切り替えを実行できる点です。これは、アクティブなスレッドごとに状態ハードウェア(レジスタファイルやプログラムカウンタなど)を複製することで実現されます。
さらなる機能強化として、同時マルチスレッド処理が挙げられます。この技術により、スーパースカラCPUは、異なるプログラム/スレッドからの命令を同一サイクル内で同時に実行できるようになります。
コンピュータアーキテクチャと構成に関するコメント:コンピュータアーキテクチャはコンピュータ工学の重要な構成要素であり、実務に携わるコンピュータエンジニアはこのトピックについて実践的な理解を持つべきである...