目次
12.1CPU構成
CPUが完了するタスク:
- 命令フェッチ:CPUはメモリ(レジスタ、キャッシュ、メインメモリ)から命令を読み取る必要があります。
- 命令を解釈する:必要なアクションを決定するには、命令をデコードする必要があります。
- データのフェッチ:命令の実行には、データに対する特定の算術演算または論理演算が必要になる場合があります。
- データの処理:命令の実行には、データに対する特定の算術演算または論理演算が必要になる場合があります。
- データの書き込み:実行の結果、メモリまたはI / Oモジュールへのデータの書き込みが必要になる場合があります。
12.2レジスタ構成
CPUのレジスタは、ユーザーに表示されるレジスタと制御レジスタおよびステータスレジスタの2つのカテゴリに分類できます。
12.2.1ユーザーに表示されるレジスタ
ユーザーに表示されるレジスタは、一般、データ、アドレス、条件コードに分けることができます。
- 汎用レジスタ(汎用レジスタ):プログラマがさまざまな目的で割り当てることができます。任意の汎用レジスタは、任意のオペコードのオペランドを保持できます。場合によっては、汎用レジスタをアドレス指定機能に使用できます。
- データレジスタ:データの保持にのみ使用でき、オペランドアドレスの計算には使用できません。
- アドレスレジスタ:それ自体が何らかの汎用である場合もあれば、特定のアドレッシングモード専用である場合もあります。例:セグメントポインタ、インデックスレジスタ、スタックポインタ。
- フラグレジスタ
12.2.2制御およびステータスレジスタ
1.命令実行には、プログラムカウンタ(PC)、命令レジスタ(IR)、メモリアドレスレジスタ(MAR)、メモリバッファレジスタ(MBR)の4種類のレジスタが不可欠です。
- プログラムカウンタ(PC):フェッチする命令のアドレスを格納します。通常、各命令フェッチの後に、PCの内容はCPUによって変更されるため、PCは常に次に実行される命令を指します。
- 命令レジスタ(IR):最後にフェッチされた命令を格納します。IRでオペコードとオペランド指定子を分析します。
- メモリアドレスレジスタ(MAR):メモリ位置のアドレスを格納します。
- メモリバッファレジスタ(MBR):メモリに書き込まれるデータワードまたはメモリから最近読み取られたワードを格納します。
▲①メモリとのデータ交換にはMARとMBRを使用します。バス編成システムにおいて、MARがされ、直接に接続され、アドレスバス、MBRがされ、直接に接続され、データバス、およびMBRと、ユーザ可視レジスタの間でデータの送受信を行います。
②ALUはMBRおよびユーザーに表示されるレジスタに直接アクセスできます。
2.多くのCPU設計には、プログラムステータスワード(PSW)と呼ばれることが多いレジスタの1つまたはグループが含まれています。通常、PSWには次のフィールドまたはフラグが含まれています。
- 符号(符号):最終的な算術演算結果の符号ビットを保持します。
- ゼロ(ゼロ):結果が0のときに設定します。
- キャリー:演算によって最上位ビットに上向きのキャリー(加算)またはボロー(減算)が発生した場合、それが設定されます。マルチワード算術演算に使用されます。
- 等しい:論理比較の結果が等しい場合に設定します。
- オーバーフロー:算術オーバーフローを示すために使用されます。
- 割り込みの有効化/無効化は、割り込みを有効または無効にするために使用されます。
- スーパーバイザー:CPUがスーパーバイザーモードとユーザーモードのどちらで実行されているかを示します。特定の特権命令は監視モードでのみ実行でき、特定のストレージ領域は監視モードでのみアクセスできます。
12.3命令サイクル
命令サイクルには、次のサブサイクルが含まれます。
- フェッチ:次の命令をメモリからCPUに読み込みます。
- 実行:操作コードを解釈し、指定された操作を完了します。
- 割り込み(割り込み):割り込みが許可され、割り込みが発生した場合は、現在のプロセス状態を保存して、割り込みを処理します
12.3.1間接サイクル
間接アドレスの読み取りは、追加の命令サブサイクルと見なすことができ、そのプロセスを次の図に示します。メインのアクションラインは、代替の命令フェッチアクションと命令実行アクションで構成されます。命令をフェッチした後、それをチェックして、間接アドレス指定が必要かどうかを判断します。そうである場合、必要なオペランドは間接アドレス指定を使用してフェッチされます。実行後、次の命令がフェッチされる前に割り込みが処理される場合があります。
命令サイクル状態図は以下のとおりです。命令がフェッチされると、そのオペランド指定子が認識される必要があります。次に、メモリ内の各オペランドを読み取ります。このプロセスでは、間接アドレス指定が必要になる場合があります。レジスタオペランドをメモリから読み取る必要はありません。操作が実行されると、結果をメインメモリに保存するために同様のプロセスが必要になる場合があります。
12.3.2データフロー
12.3.2.1データフローとフェッチサイクル
最初に、PCはフェッチされる次の命令のアドレスを格納します。このアドレスはMARに転送され、アドレスバスに配置されます。コントローラはメモリ読み取り要求を発行し、メモリは結果をデータバスに配置し、CPUはそれをMBRにコピーしてから、IRに送信します。この期間中、PCは1ずつインクリメントされ、次の命令フェッチの準備をします。
12.3.2.2データフローと間接サイクル
命令フェッチサイクルが経過すると、コントローラはIRの内容をチェックして、間接アドレス指定オペランドを使用する指定子があるかどうかを判断します。はいの場合、間接サイクルに入ります。MBRの右端のNビットは、MARに送信されるアドレス参照です。次に、コントローラはメモリの読み取りを要求し、必要なオペランドアドレスを取得して、MBRに送信します。
12.3.2.3データフローと割り込みサイクル
CPUが中断後に以前のアクションを再開できるように、PCの現在のコンテンツを保存する必要があります。その後、PCのコンテンツがMBRに転送され、メモリに書き込まれます。この目的のために、特別なメモリ位置がコントローラによってMARにロードされます。スタックポインタの可能性があります。続いて、割り込みサブルーチンのアドレスがPCにロードされます。その結果、次の命令サイクルはこの対応する命令から始まります。
命令のフェッチ、間接参照、および割り込みサイクルはすべて単純で予測可能です。
12.4命令パイプラインテクノロジー
12.4.1パイプライン戦略
命令処理の次の分解を検討してください。
- 命令フェッチ(FI):次に予想される命令をバッファに読み込みます。
- デコード命令(DI):オペコードとオペランド指定子を決定します。
- オペランドの計算(CO):各ソースオペランドの実効アドレスを計算します。これには、オフセットアドレス指定、レジスタ間接アドレス指定、間接アドレス指定、またはその他の形式のアドレス計算が含まれる場合があります。
- オペランドのフェッチ(FO):メモリから各オペランドをフェッチします。レジスタ内のオペランドをフェッチする必要はありません。
- 実行命令(EI):指定された操作を完了します。指定されたデスティネーションオペランドの場所がある場合は、結果をこの場所に書き込みます。
- 書き込み操作番号(WO):結果をメモリに保存します。
次の図は、このような6ステージのパイプラインを示しています。これにより、9つの命令の実行時間を54時間単位から14時間単位に短縮できます。
図12-11は、図12-10と同じ手順を使用して、条件付き遷移の効果を示しています。命令3は、命令15に進むことができる条件付き分岐命令であると想定します。
12.4.2パイプラインのパフォーマンス
命令パイプラインのサイクルタイムTは、パイプライン内の命令のグループを一定期間進めるのに必要な時間です。この期間は、次のように表すことができます。
ここで、n個の命令が進行中であり、転送が発生しないと仮定します。Tk、nをkステージパイプラインがn個の命令すべてを実行するのに必要な合計時間とすると、
パイプラインを使用しない場合と比較して、命令パイプラインを使用する場合のスピードアップ率は次のように定義されます。
12.4.3パイプラインアドベンチャー
パイプラインアドベンチャーには、リソースアドベンチャー、データアドベンチャー、コントロールアドベンチャーの3種類があります。
12.4.3.1リソースハザード
パイプラインに入った2つ(またはそれ以上)の命令が同じリソースを使用する必要がある場合に発生します。その結果、パイプラインの一部で、これらの命令を並列ではなく直列に実行する必要があります。リソースハザードは、構造ハザードと呼ばれることもあります。
例は次のとおりです。
12.4.3.2データハザード
オペランドの場所へのアクセスに競合がある場合に発生します。データハザードは通常、次の形式で説明できます。プログラム内の2つの命令が順番に実行され、両方が同じメモリまたはレジスタオペランドにアクセスします。2つの命令の実行が厳密にシリアルである場合、問題は発生しません。ただし、これら2つの命令がパイプラインで実行されると、オペランドが順不同で更新され、厳密なシリアル実行とは異なる結果になる可能性があります。
例は次のとおりです。
データアドベンチャーには3つのタイプがあります。
- 書き込み後の読み取り(RAW)または真の依存関係:1つの命令がレジスターまたはメモリー位置を書き換え、後続の命令が書き換えられたレジスターまたはメモリー位置からデータを読み取ります。書き込み操作が完了する前に読み取り操作を開始すると、リスクが発生します。
- 読み取り後の書き込み(WAR)または反依存性(反依存性):1つの命令がレジスターまたはメモリー位置を読み取り、後続の命令がレジスターまたはメモリー位置の内容を書き換えます。読み取り操作が完了する前に書き込み操作を開始すると、リスクが発生します。
- 書き込み後書き込み(WAW)または出力依存関係:2つの命令は、同じレジスタまたはメモリ位置を書き換える必要があります。これら2つの命令の書き込み操作が予想とは逆の順序で発生すると、リスクが発生します。
12.4.3.3ハザードの管理
ブランチハザードとも呼ばれ、パイプラインがブランチを誤って予測し、後の段階でキャンセルする必要のある命令を読み取るときに発生します。
12.4.4分岐命令の処理
条件付き分岐命令を処理するために、いくつかの方法が使用されています。
- 複数のストリーム
- 分岐ターゲットをプリフェッチします
- ループバッファ
- 分岐予測
- 遅延分岐
1.複数の命令ストリーム
パイプラインの先頭をコピーし、パイプラインが2つの命令ストリームを使用してこれら2つの命令を同時にフェッチできるようにします。このアプローチには2つの問題があります。
①複数のパイプラインを使用する場合、レジスタとメモリアクセスの競合遅延が発生します。
②元の分岐判定が解決される前に、別の分岐命令がパイプラインに入る場合があります(どちらの方向でも)。このように、命令ストリームを追加する必要があります。
2.分岐ターゲットをプリフェッチします
条件分岐命令が認識されると、分岐命令に続く命令に加えて、分岐ターゲットの命令もフェッチされます。この目標は、分岐命令が実行されるまで保存されます。分岐が発生した場合、ターゲットはすでにプリフェッチされています。
3.バッファレジスタ
バッファレジスタは、パイプラインの命令フェッチステージによって維持される小さいが非常に高速なメモリであり、最新の順序でフェッチされたn個の命令が含まれています。転送が行われようとしている場合、ハードウェアは最初に転送ターゲットがこのバッファにあるかどうかをチェックします。そうである場合、次の命令がこのバッファからフェッチされます。
4.分岐予測
- 決して取られなかった予測
- 常にとられる予測
- オペコードによる予測
- 取られた/取られなかったスイッチ
- 転送履歴テーブル(ブランチ履歴テーブル)
最初の3つのメソッドは静的であり、条件付き分岐命令の過去の実行履歴に依存しません。後者の2つの方法は動的であり、実行の履歴に依存します。
5.遅延分岐