レイテンシー指向プロセッサアーキテクチャは、低レイテンシーでシリアルコンピューティングスレッドを処理するように設計されたマイクロプロセッサのマイクロアーキテクチャです。これは、1970 年代以降に開発されたほとんどの中央処理装置(CPU) に共通する特徴です。これらのアーキテクチャは一般的に、与えられた時間ウィンドウ内で単一のシリアルスレッドに属するできるだけ多くの命令を実行することを目的としていますが、フェッチからリタイア段階まで単一の命令を完全に実行するのにかかる時間は、数サイクルから場合によっては数百サイクルまで変化する可能性があります。[ 1 ]レイテンシー指向プロセッサアーキテクチャは、処理するすべての個々のスレッドのサービスレイテンシーよりもシステム全体のスループットを重視するスループット指向プロセッサとは正反対です。[ 2 ] [ 3 ]
一般的に、レイテンシ重視のプロセッサアーキテクチャは、単一のデータストリーム上で動作する単一のタスクを実行するため、Flynnの分類ではSISDに分類されます。レイテンシ重視のプロセッサアーキテクチャには、Intel MMXやSSEなどのSIMD命令セット拡張機能が含まれる場合もあります。これらの拡張機能は大規模なデータセット上で動作しますが、主な目的は全体的なレイテンシを削減することです。[ 2 ]
単一の計算タスクの全体的なレイテンシを削減するために、多くのアーキテクチャ技術が採用されています。これらは通常、メモリまたは命令キャッシュから命令がフェッチされるとすぐに処理できるように、パイプラインに追加のハードウェアを追加するものです。これらのアーキテクチャの注目すべき特徴は、チップのかなりの領域が実行ユニット自体以外の部分で使用されていることです。これは、コンピューティング環境で「典型的な」タスクを完了するのに必要な時間を短縮することを目的としているためです。典型的な計算タスクは、同じタスクの前の命令によって生成された結果に大きく依存する一連の命令です。したがって、マイクロプロセッサが個々の命令自体に必要な計算以外の多くのタスクに時間を費やすのは当然です。計算中に発生したハザードが迅速に解決されない場合、スレッドのレイテンシが増加します。これは、ハザードが後続の命令の実行を停止させ、パイプラインの実装によっては、依存関係が解決されるまで進行を完全に停止させるか、将来の命令でさらに多くのハザードの雪崩を引き起こし、スレッドの実行時間をさらに悪化させる可能性があるためです。[ 4 ] [ 5 ]
マイクロアーキテクチャ技術の設計空間は非常に広範です。以下に、スレッドの全体的なレイテンシを削減するために最も一般的に用いられる技術をいくつか示します。
今日のほとんどのアーキテクチャは、ロード/ストアアーキテクチャのように、より短く単純な命令を使用しており、命令パイプラインを最適化して実行速度を向上させています。命令は通常すべて同じサイズであるため、命令フェッチロジックの最適化にも役立ちます。このようなISAはRISCアーキテクチャと呼ばれます。[ 6 ]
パイプライン処理は、同じ実行スレッドからの複数の命令の実行をオーバーラップさせることで、クロック周波数を上げたり、単位時間あたりに完了する命令数を増やしたりすることで、スレッドの全体的な実行時間を短縮します。単一の命令がすべての実行段階を完了するのを待つのではなく、複数の命令がパイプライン内のそれぞれの段階で同時に処理されます。[ a ]
この手法は、プログラマにISAで指定されているよりも効果的にレジスタファイルの合計サイズを増やし、誤った依存関係を排除するために使用されます。同じレジスタを参照する2つの連続した命令があるとします。最初の命令はレジスタを読み取り、2番目の命令はレジスタに書き込みます。プログラムの正しさを維持するには、最初の命令が元の値を読み取る前に2番目の命令がレジスタに書き込まないようにすることが不可欠です。これは、書き込み後読み出し(WAR)依存関係の一例です。この依存関係を排除するために、パイプラインは命令を内部レジスタに割り当てることで、内部的に命令の名前を変更します。そのため、命令は実行され、プログラムが意図した実際の宛先レジスタには後で書き込まれるにもかかわらず、その結果は後続のすべての命令ですぐに利用できるようになります。同様に、両方の命令が同じレジスタに書き込み後書き込み(WAW)することだけを意図している場合、パイプラインは命令の名前を変更し、実行を直列化する必要なく、その結果が後続の命令で利用できるようにします。[ b ]
キャッシュ、メインメモリ、ハードディスクなどの不揮発性ストレージ(プログラム命令とデータが格納される場所)を含むさまざまなレベルのメモリは、空間的局所性と時間的局所性を活用して、メモリへのアクセス時間の合計を短縮するように設計されています。プロセッサがメモリからデータがフェッチされるのを待つ時間が短いほど、何もせずに待機している間にパイプラインリソースを消費する命令の数が少なくなります。命令パイプラインは、内部バッファ(例えば予約ステーション)がすべてそれぞれの容量でいっぱいになると完全に停止します。したがって、命令がパイプライン内でアイドルサイクルを消費する時間が少なければ少ないほど、フェッチロジックが単位時間あたりにキャッシュ/メモリからより多くの命令を取り込むことができるため、命令レベル並列性(ILP)を活用する可能性が高くなります。[ c ]
パイプラインの停止の主な原因は、制御フローの依存関係、つまり分岐命令の結果が事前にわからない場合(通常はそうなる)です。今日の多くのアーキテクチャでは、分岐予測コンポーネントを使用して分岐の結果を推測します。実行はプログラムの予測パスに沿って継続されますが、命令は投機的としてタグ付けされます。推測が正しければ、命令は正常に完了し、結果をレジスタファイル/メモリに更新できます。推測が間違っていた場合は、すべての投機的命令がパイプラインからフラッシュされ、実行はプログラムの実際の正しいパスに沿って(再)開始されます。高い予測精度を維持することで、パイプラインは実行スレッドのスループットを大幅に向上させることができます。[ d ]
スレッド内のすべての命令の実行時間は同じではありません。スーパースカラパイプラインでは、現在の状態と命令の種類に応じて、命令の実行パスが複数存在するのが一般的です。そのため、1サイクルあたりの命令数(IPC)を増やすために、パイプラインは命令を順不同で実行できるようにし、プログラムの後半にある命令が、完了に時間がかかる命令によって停止しないようにします。すべての命令は、パイプラインによってフェッチされたときに再順序バッファに登録され、元のプログラムの順序で実行(つまり、結果を書き戻す)できるようにすることで、正確性を維持します。[ e ]
スーパースカラ命令パイプラインは、単純なスカラパイプラインとは異なり、クロックサイクルごとに複数の命令を取り込みます。これにより、データフローまたは制御フローの依存関係によってパイプラインが停止しない限り、各サイクルでフェッチされる命令の数だけ命令レベルの並列性が向上します。スーパースカラパイプラインのリタイア率は通常フェッチ率よりも低いですが、単位時間あたりに実行される命令の総数(> 1)は、一般的にスカラパイプラインよりも多くなります。[ f ]
対照的に、スループット重視のプロセッサアーキテクチャは、一定時間内に実行できる「有用な作業」の量を最大化するように設計されています。有用な作業とは、大量のデータに対する大規模な計算を指します。スループット重視のプロセッサは、ワークロードを並列化することで、多くの計算を同時に実行できるようにします。計算は、単一のタスクまたは限られた数の複数のタスクに属する場合があります。1回の実行を完了するのに必要な合計時間は、レイテンシ重視のプロセッサアーキテクチャよりも大幅に長くなりますが、大規模な計算セットを完了するのに必要な合計時間は大幅に短縮されます。サイクルあたりのスループットを高めるために、レイテンシはしばしば犠牲にされます。[ 3 ]その結果、レイテンシ重視のプロセッサは、スループット重視のプロセッサよりも1回の計算をはるかに速く完了する可能性がありますが、レイテンシ重視のプロセッサが1回の計算を完了する頃には、スループット重視のプロセッサは数百回の計算を途中まで進めている可能性があります。[ 2 ]
レイテンシ重視のプロセッサは、各プロセッサ内の分岐予測、データ転送、リオーダーバッファ、大きなレジスタファイル、キャッシュなどの高度な制御構造にチップ面積のかなりの部分を費やします。これらの構造は、命令ごとの動作レイテンシとメモリアクセス時間を短縮し、結果をできるだけ早く利用可能にします。一方、スループット重視のアーキテクチャは、通常、キャッシュがはるかに小さく、制御ロジックが単純な多数のプロセッサを備えています。これにより、メモリ帯域幅を効率的に利用し、同じチップ面積で実行ユニットの総数を増やすことができます。[ 3 ]
GPUは、スループット重視のプロセッサアーキテクチャの典型的な例である。