1. 概要

このチュートリアルでは、高度な中央処理装置( CPU )を構築するための複雑なアイデアを分析します。 レジスタ算術論理演算ユニット、および制御ユニットを使用してCPUを抽象化しますが、キャッシュや命令パイプラインなどの高度なメカニズムなど、他の複雑な部分があります。 、分岐予測、その他多数。

2. 序章

これらの記事を作成および公開しているデバイスは、おそらくギガヘルツの速度で実行されています。 これは、毎秒10億の命令が実行されます。 1秒間に1回の計算しか実行しない初期のコンピューターを考えると、それ以来、コンピューターは長い道のりを歩んできました。

コンピューティングの初期の頃、プロセッサの設計者は通常、トランジスタのスイッチング時間を改善したり、チップ内のトランジスタの数を増やしたりしようとしていました。 ただし、トランジスタとチップの性質上の制限により、プロセッサの設計者はパフォーマンスを向上させるためにさまざまなメカニズムを開発しました。

CPUは、命令を介して最も小さな計算を実行します。 たとえば、2つの数値を除算するために、この操作を減算のより小さな問題に分解できます。 ゼロまたは負の数に達するまで、一方の数値をもう一方の数値から抽出し続けます。 この方法は多くのクロックサイクルを消費します。

現在、ほとんどのコンピュータプロセッサには、ALUがハードウェアで実行できる除算命令があります。 これによりALUはより大きく、より複雑になりますが、コンピューティングの歴史で何度も好まれてきた、速度と複雑さのトレードオフとして役立ちます。

この除算命令以外にも、ファイルの暗号化、圧縮ビデオのデコード、グラフィックス操作などの特定の回路を備えた特殊なCPUがいくつかあります。 たとえば、IntelのMMXやAMDの3DNow! 次の図の特殊なCPUの例をいくつか示します。

命令セットに対するこれらの拡張機能は、時間の経過とともに成長してきました。 人々がこれらの指示を利用するとき、それらを削除することは困難です。 したがって、命令セットは、すべてのオペコードを保持しながらますます大きくなる傾向があります。 最初のCPUの1つであるIntel4004 には46の命令しかなく、Kenbak-1などの完全に機能するコンピューターを構築するのに十分でした。

2.1. 最新のプロセッサのボトルネック

最新のコンピュータプロセッサには、何千ものさまざまな命令があります。 それらはあらゆる種類の複雑な内部回路を利用します。 これらの派手な命令セットと高いクロック速度は、別の問題を引き起こします。 CPUにデータを出し入れするのに十分な速さです。 非常に多くの製品を数秒で生産できる家具工場があると想像してみてください。 工場内にはいつもたくさんの森が必要です。

この時点で、ボトルネックはRAMです。 これは、CPUの外部にあるメモリモジュールです。 私たちの家具工場の例えとして、それが都市の外の森だと想像してみてください。 これは、バスと呼ばれるデータワイヤとともにデータをRAMとの間で転送する必要があることを意味します。

このバスはほんの数センチです。 電気信号は光速に近い速度で伝わりますが、ギガヘルツレート(数十億分の1秒)を使用すると、わずかな遅延でも問題になります。 RAMは、アドレスを検索してデータを取得するための時間も必要です。 したがって、RAMからのロードには数百クロックサイクルかかる場合があります。 例えに戻ると、その間ずっと森から木材を取り出そうとすると、家具を作るための木材がないため、工場は何もできません。 同様に、CPUはただそこに座ってデータを待っています。

3. キャッシュ

このボトルネックを克服するための1つの解決策は、CPUに小さなストレージユニットを配置することです。 これはキャッシュと呼ばれます。 下の図からわかるように、プロセッサのチップには多くの領域がありません。 したがって、ほとんどのキャッシュのサイズはキロバイトまたはメガバイトですが、RAMはギガバイトです。 私たちの例えをもう一度考えてみると、それは森が家具を作るための倉庫のようなものです。 森からの木材を待つ代わりに、工場近くの倉庫に保管することができます。 このようにして、巧妙な方法でプロセスをスピードアップできます。

CPUがRAMからメモリ位置を要求するときはいつでも、RAMは1つの値だけでなく、データのブロック全体を送信できます。 これは、単一の値を送信するよりもいくらか時間がかかりますが、このデータブロックをキャッシュに保存することができます。 コンピューターは頻繁に整理されて連続して処理されるデータを保存するため、これは非常に有益です。

プロセッサがいくつかの式を計算しているとき、RAMまで行く必要はありません。 キャッシュはプロセッサに非常に近いため、通常、単一のクロックサイクルでデータを提供できます。 例えを考え直すだけで、フォレストに到達する代わりに、プロセッサのキャッシュであるウェアハウスにあるリソースを直接使用できます。

3.1. キャッシュヒット、キャッシュミス、およびダーティビット

RAMから要求されたデータがすでにキャッシュにある場合、それをキャッシュヒットと呼びます。 要求されたデータがキャッシュにない場合は、RAMまで移動する必要があり、これをキャッシュミスと呼びます。

2つの別々の場所にデータがあると、同期の問題が発生する可能性があります。 キャッシュ内のアドレスの値を変更するときは、RAM内のアドレスも更新する必要があります。 この目的のために、キャッシュには、格納するメモリのブロックごとにフラグがあります。 それはダーティビットと呼ばれます。 ほとんどの場合、この同期はキャッシュがいっぱいになったときに発生します。 キャッシュが古いブロックを消去してスペースを解放する前に、キャッシュはダーティビットをチェックします。 汚れている場合は、古いデータブロックがRAMに書き戻されます。

4. 命令パイプライン

命令パイプラインは、CPUのスループットを向上させるためにCPU設計者が採用するもう1つのメカニズムです。 家具会社があるという例えに戻りましょう。家具を作るには、いくつかの操作が必要です。 木を手に入れるように、木を細かく切って、なんとか組み立てます。 すべての木材を入手してすべての木材プロセスを個別に切断する代わりに、それらを並列化することができます。

家具の例のように、CPUは、単純にインクルード、フェッチ、デコード、および実行する命令サイクルに従う必要があります。 3つのステージすべてを終了し、その後新しいサイクルを開始できます。 ただし、最初の命令をフェッチした直後に別の選択肢があります。別の命令をフェッチできます。 各ステージはCPUの異なる部分を使用するため、それらを並列化できます。

下の図を見て、理解を深めましょう。 これまで見てきたように、2番目の命令にフェッチするために、最初の命令が実行されるのを待っています。

ただし、1つの命令が実行されている間、次の命令がデコードされる可能性があります。 これらの個別のプロセスはすべてオーバーラップする可能性があるため、CPUのすべての部分が常にアクティブになります。 次の図のこの設計により、スループットを3倍にすることができます。

4.1. 指示の依存性

命令間に依存関係がある可能性があります。 たとえば、別の命令によって変更されようとしているものをフェッチする場合があります。その場合、パイプラインに古い値が含まれることになります。

このような場合を回復するには、パイプラインプロセッサはデータの依存関係を先読みする必要があり、存在する場合は、パイプラインを停止して問題を取り除きます。ラップトップやスマートフォンに存在するような排他的で洗練されたプロセッサは、ストールを減らし、パイプラインの流れを維持するための依存関係。 これをアウトオブオーダー実行と呼びます。

4.2. 投機的実行と分岐予測

もう1つの問題は、条件付きジャンプ条件です。 これらの命令は、値に応じてプログラムの実行パスを変更できます。

基本的なパイプラインプロセッサがジャンプ命令を検出すると、値が完了するのを待つ間、長いストールを実行します。プロセッサは、ジャンプの結果を知っている場合にのみパイプラインの補充を開始します。 ただし、これにより大幅な遅延が発生する可能性があります。したがって、ハイエンドプロセッサには、この問題に対処するためのさまざまな手法があります。

今後のジャンプ命令、分岐について考えてみましょう。 高度なCPUは、進むパスを推定し、その仮定に基づいた命令でパイプラインのロードを開始します。 この手法を投機的実行と呼びます。

これらの見積もりが間違っている場合、CPUはすべての推測結果を破棄し、フラッシュを実行する必要があります。 これらのフラッシュの影響を減らすために、 CPU設計者は、分岐先を推測するための特別な方法を開発しました。 これは分岐予測と呼ばれます。 最新のプロセッサの分岐予測の精度は向上し、50/50の推測を上回りました。 ただし、この排他的な設計方法は、投機的実行サイドチャネル脆弱性として知られるセキュリティの問題を引き起こす可能性があります。

5. スーパースカラープロセッサとマルチコアプロセッサ

スーパースカラープロセッサは、次の図に示すように、クロックサイクルごとに複数の命令を実行できます。 パイプライン設計でも、実行段階では、CPUの一部の領域が完全にアイドル状態になる可能性があります。 たとえば、メモリから値をフェッチする命令を実行している間、ALUはアイドル状態になります。

スーパースカラープロセッサは、一般的な命令の回路を複製します。 個別のプロセッサやコアはありません。 これは、ALUなどの単一のCPU内の実行リソースを活用します。

パフォーマンスを向上させるもう1つの方法は、マルチコアプロセッサを使用して、多数の命令ストリームを同時に実行することです。 デュアルコアまたはクアッドコアプロセッサは、次の図に示すように、単一のCPUチップ内の複数の独立した処理ユニットの例です。 これは、2008年にリリースされた次世代Intelマイクロアーキテクチャ(Nehalem)のコア構造を表しています。 他にもいくつかの重要な部分がありますが、この記事の範囲では、それらについて詳しくは説明しません。

6. 結論

この記事では、高度なCPUの複雑な部分とメカニズムについて簡単に説明しました。 物事をより理解しやすくするために、キャッシュについてのアナロジーを共有しました。 また、命令パイプラインについて説明し、スーパースカラーおよびマルチコアプロセッサがどのように機能するかを確認しました。