コンピュータ アーキテクチャ - 最終レビュー
第 1 章 定量的設計と分析の基礎
| 1.2.6 並列度および並列アーキテクチャの分類
アプリケーションの並列処理には主に 2 つのタイプがあります。
- データレベルの並列性: 多くのデータ項目を同時に操作することで実現される並列性
- タスクレベルの並列処理: 個別に処理して大量に並列実行できる作業タスクを作成します。
すべてのコンピューターは、命令フローとデータ フローの並列性に基づいて次のように分類できます。
- SISD (Single struction Stream Single Data): 単一プロセッサですが、命令レベルの並列処理を利用できます。
- SIMD (単一命令ストリーム複数データストリーム): 同じ命令が、異なるデータストリームを使用して複数のプロセッサによって実行され、データレベルの並列処理を開発できます。
- MISD (Multiple struction Stream Single Data Stream): 一時的に存在しません
- MIMD (複数の命令ストリーム、複数のデータ ストリーム): 各プロセッサーは独自の命令を抽出し、独自のデータを操作して、タスクレベルの並列処理を目標とします。
| 1.3 コンピュータのアーキテクチャ
付録 A を参照
| 1.4.1 遅延よりも帯域幅が優先
帯域幅の改善速度は遅延の改善速度よりもはるかに速い
| 1.9 コンピュータ設計の定量的原則
コンピューター設計の 3 つの基本原則:
- 並列処理を活用する
- 局所性原理
- よくある状況に焦点を当てる: アムダールの法則
高速化率 = 改善された実行時間を使用した元の実行時間 速度向上率 = \frac{元の実行時間}{改善された実行時間を使用}速度向上率=改善された実行時間を使用する元の実行時間
新しい実行時間 = 元の実行時間 × [( 1 − アップグレード率) + アップグレード率、アップグレード加速率] 新しい実行時間 = 元の実行時間 \times [(1-アップグレード率) +\frac{アップグレード率}{アップグレード加速率] } ]新しい実行時間=元の実行時間×[( 1−アップグレード率)+アップグレード加速率アップグレード率]
合計高速化率 = 元の実行時間 新しい実行時間 = 1 ( 1 − アップグレード率) + アップグレード率 アップグレード高速化率 合計高速化率 = \frac{元の実行時間}{新しい実行時間}=\frac{1}{(1-アップグレード率)+\frac{アップグレード率}{アップグレード加速率}}全体的な高速化=新しい実行時間元の実行時間=( 1−アップグレード率)+アップグレード加速率アップグレード率1
第 3 章 命令レベルの並列性
| 3.1 命令レベルの並列処理
最新のプロセッサは、パイプラインを介して命令レベル並列処理 (ILP) を実装し、パフォーマンスを向上させます。パイプライン プロセッサの CPI は次のとおりです。
パイプライン CPI = 理想的なパイプライン CPI + 構造化ハザード一時停止 + データ ハザード一時停止 + コントロール ハザード一時停止 パイプライン CPI = 理想的なパイプライン CPI + 構造化ハザード一時停止 + データ ハザード一時停止 + コントロール ハザード一時停止パイプラインCP I=理想的なパイプラインCP I+構造化されたアドベンチャーの一時停止+データアドベンチャー一時停止+危険な一時停止の制御
一時停止の単位は命令ごとです。主な ILP テクノロジーは次のとおりです。
テクノロジー | CPIのどの部分を引き下げるべきでしょうか? | ハードウェア/ソフトウェアベース |
---|---|---|
フォワード | データアドベンチャー一時停止 | ハードウェア |
基本的な動的スケジューリング (スコアボード) | データアドベンチャー一時停止 | ハードウェア |
名前変更による動的スケジューリング (Tomaluso) | データアドベンチャー一時停止 | ハードウェア |
遅延分岐と基本分岐予測 | 冒険の一時停止を制御する | ハードウェア |
動的分岐予測 | 冒険の一時停止を制御する | ハードウェア |
ループ展開 | 冒険の一時停止を制御する | ソフトウェア |
コンパイラパイプラインのスケジューリング | データアドベンチャー一時停止 | ソフトウェア |
パイプラインで最も一般的なリスクはデータ リスクです。データ リスクは依存関係 (依存関係) によって引き起こされます。依存関係には次の 3 種類があります。
- 現在の命令のオペランドは前の命令の結果です。これは真のデータ依存であり、リードアフターライト (RAW) リスクにつながる可能性があります。
- 現在の命令の結果は前の命令のオペランドに書き込まれますが、これは逆依存性があり、ライトアフターリード (WAR) リスクにつながる可能性があります。
- 現在の命令と前の命令は同じ場所に書き込み、出力は依存しているため、ライトアフターライト (WAW) リスクが生じる可能性があります。
相関関係は命令間の関係にすぎず、必ずしもパイプラインにリスクを引き起こすわけではなく、パイプラインの具体的な実装構造に依存します。
| 3.2 ループの展開
ループ アンローリングは、命令レベルの並列処理を向上させるテクノロジです。ループ アンローリングを使用する場合は、次の決定と変換を行う必要があります。
- ループ展開が役立つように、反復ループが関連していないことを確認してください。
- 異なるレジスタを使用して、異なる演算 (複数の変数を使用) に同じレジスタを使用することによって生じる制約を回避します。
- 冗長なテストと分岐命令を削除する
- スワップ位置をスケジュールする前に、異なる反復のロード命令とストア命令が関連していないか、同じアドレスを参照していないかを観察してください。
- スケジュールコード
|ループ展開例
次のコード スニペットを考えてみましょう。
for(i=999;i>=0;i--){
x[i] = x[i] + s;
}
x[i] と s が両方とも浮動小数点数であると仮定すると、対応する RISC-V 64 ビット命令は次のようになります。
Loop:
fld f0,0(x1) #x1是x[999]的地址
fadd.d f4,f0,f2 #f2存储s
fsd f4,0(x1)
addi x1,x1,-8 #双精度浮点数数组,i--相当于地址-8
bne x1,x2,Loop
RISC-V パイプラインの場合、浮動小数点演算のレイテンシが次のようになり、整数演算のレイテンシが 0 であると仮定します。
次に、パイプラインの実行シーケンスを取得できます。
Loop: fld f0,0(x1)
stall
fadd.d f4,f0,f2
stall
stall
fsd f4,0(x1)
addi x1,x1,-8
bne x1,x2,Loop
上記の命令シーケンスの完了には 8 サイクルが必要ですが、スケジューリングによって 1 回の一時停止を減らすことができます。
Loop: fld f0,0(x1)
addi x1,x1,-8
fadd.d f4,f0,f2
stall
stall
fsd f4,0(x1)
bne x1,x2,Loop
このコードのため、反復は無関係です。このループを 4 回展開します。最初の 3 つの分岐ジャンプ命令は削除できます。i– は i=i-4 に変換できます。制約を避けるために、別のレジスタを使用してみてください。命令シーケンスは次のとおりです。
Loop: fld f0,0(x1)
fadd.d f4,f0,f2
fsd f4,0(x1)
fld f6,-8(x1)
fadd.d f8,f6,f2
fsd f8,0(x1)
fld f10,-16(x1)
fadd.d f12,f10,f2
fsd f12,-16(x1)
fld f14,-24(x1)
fadd.d f16,f14,f2
fsd f16,-24(x1)
addi x1,x1,-32
bne x1,x2,Loop
ロードと演算の間には一時停止があり、また演算と格納の間にも一時停止があります。したがって、この命令シーケンスはスケジュールする必要があります。異なるレジスタが使用されるため、ロードとロードの間、およびロードと格納の間に一時停止が発生します。操作と操作。一時停止することはないので、すべてをまとめてスケジュールします。
Loop: fld f0,0(x1)
fld f6,-8(x1)
fld f10,-16(x1)
fld f14,-24(x1)
fadd.d f4,f0,f2
fadd.d f8,f6,f2
fadd.d f12,f10,f2
fadd.d f16,f14,f2
fsd f4,0(x1)
fsd f8,0(x1)
fsd f12,-16(x1)
fsd f16,-24(x1)
addi x1,x1,-32
bne x1,x2,Loop
これで、シーケンス全体で一時停止がなくなり、これら 4 つのループの計算は 14 サイクルで完了でき、ループあたり平均 3.5 サイクルになります。これは、ループ拡張を使用しない場合より明らかに高速です。
| 3.4-3.5 動的スケジューリングと Tomasulo アルゴリズム
動的スケジューリングはより柔軟であり、命令をさまざまな順序で実行できるようになり、ストールが軽減されます。ハードウェアによる命令の実行を再配置すると、さまざまなパイプラインでコードを効率的に実行できるようになり、コンパイル時には不明な依存関係 (メモリ参照を含む) やキャッシュ ミスを処理できます。
付録 C で紹介されているスコアボード アルゴリズムは、命令を順不同で実行できる動的スケジューリング アルゴリズムです。スコアボードは、指導の各段階でさまざまなデータリスクと構造リスクを個別にチェックし、一時停止を通じてリスクを回避します。
Tomasulo アルゴリズムは、スコアボード アルゴリズムと同様の考え方を使用して、命令の実行ステータスを記録し、リスクをチェックします。違いは、Tomasulo がレジスタ名の変更を使用して 2 つの誤ったデータ依存関係 (WAR と WAW) を排除し、対応する 2 つのデータ リスクを排除していることです。さらに、Tomasulo アルゴリズムでは、機能ユニットに複数のバッファがあり、機能ユニットが占有されている場合、同じ機能ユニットを使用する命令はリザベーション ステーションで待機できるため、構造上のリスクによる一時停止が軽減されます。
Tomasuloアルゴリズムの実装構造
Tomasolu アルゴリズムの実装構造は次のとおりです。
- FP OP Queue: 命令キュー、命令はここから発行されます
- リザベーション ステーション: 送信されたコマンド情報とバッファリングされたデータを保持するリザベーション ステーション
- Address Unit: アドレス計算ユニット ストレージアドレスは、ストレージ命令の実行前に計算されます。
- メモリユニット:ストレージユニット
- CDB: データ ブロードキャスト バス。レジスタ ファイルとリザベーション ステーションに直接接続してデータを送信します。
予約局、レジスタ結果ステータステーブル、命令ステータステーブル
Tomasulo アルゴリズムでは、命令の実行には、起動、実行、ライトバックの 3 つの段階があります。コマンドステータステーブルは次のとおりです。
- 命令発行:Tomasulo アルゴリズムは命令を順次発行しますが、発行可能かどうかの判断条件は、命令の対応するパスのリザベーションステーションに空きがあることです。命令が発行されると、その命令はリザベーション ステーションのエントリを占有して、リザベーション ステーションとレジスタ結果ステータス テーブルを更新します。送信中は、読み取れるデータがリザベーションステーションに読み込まれます。レジスタ結果ステータステーブルを更新する場合、後続の命令の最新の書き込み情報が常にテーブルに保持され、後続の命令はデスティネーションレジスタに書き込まれます。前の命令の結果は書き込まれません。前の手順は、CDB をリッスンしてデータを直接取得することができます。
- 実行: ソース データの準備ができたら、実行が開始され、実行デバイスの機能ユニットが占有されます。
- ライトバック: CDB バスを介してレジスタ ファイルと各リザベーション ステーションにデータを直接渡し、レジスタ結果ステータス テーブルに従ってレジスタ ファイルを更新し、リザベーション ステーションとレジスタ結果ステータス テーブルの情報をクリアします。
スコアボードでは、各構成パスは 1 つの命令のみを保存できます。Tomasulo アルゴリズムは、パスごとに一連のバッファーを構成します。同じコンピューティング ユニットの場合、複数の命令をバッファリングできます。コンピューティング ユニットが占有されている場合、後続の命令を予約ステーションにすることができます。待っています。リザベーション ステーションは、読み取り可能なデータをリザベーション ステーションに直接記録できます。準備ができていないデータについては、計算が完了するとすぐにブロードキャスト データがキャプチャされ、データ ソースにはリザベーション ステーションの番号がマークされます。レジスタ番号の代わりに、レジスタの再配置を実現します。
スコアボードと同様に、Tomasulo アルゴリズムもレジスタ結果ステータスを記録し、レジスタ更新のデータ ソースを記録します。データソースは最新の指示データを選択します。
Tomasulo のアルゴリズムの欠点
- 実装が複雑
- 高速CDBが必要
- CDBによってパフォーマンスが制限される
| Tomasulo アルゴリズムのフォーム入力
Tomasulo アルゴリズムを使用してフォームに入力するときは、読み取り可能な値をオペランドに直接入力することに注意する必要があります。また、現在のサイクルのオペランド op がライトバックされている場合、現在のサイクルで発行された命令が op を必要とする場合、その op はスコアボードのように次のサイクルで読み取られるのではなく、リザベーション ステーションで直接読み取られます。書き戻し後(書き戻し時のサイクルタイムのテーブル)、レジスタ結果ステータステーブルにも対応する値が記録される必要があります。スコアボードと同様に、命令ライトバック サイクル中に、フォームに記入するときにこの命令に関するリザベーション ステーションの情報を削除できます。
第 5 章 スレッドレベルの並列処理
| 5.4 ディレクトリ整合性プロトコルと監視整合性プロトコル
マルチコア プロセッサには、共有レベルと専用レベルの両方のキャッシュが存在する場合があります。複数のプロセッサがメモリ上のデータを共有する場合、共有データを独自の専用キャッシュにキャッシュする可能性があり、異なるプロセッサは同じデータの異なる値を独自のキャッシュに保存する可能性があり、これはキャッシュの一貫性の問題です。
キャッシュの一貫性を確保する方法は、一貫性プロトコルを使用することです。次の 2 つの一貫性プロトコルがあります。
- ディレクトリ: 物理メモリ ブロックの共有状態をディレクトリと呼ばれる場所に保持します。
- リスニング: キャッシュに物理メモリ ブロックのコピーがある場合、そのブロックの共有状態が追跡されます。すべてのキャッシュは何らかのブロードキャスト メディアを通じてアクセスでき、すべてのキャッシュ コントローラーはこのメディアをリッスンします。
どちらのプロトコルも書き込み無効化プロトコルであり、プロセッサは書き込み操作の実行中に他のコピーを無効にします。
スヌープ コヒーレンス プロトコルは通常、選択されたキャッシュ ブロックの状態を変更し、バスを使用してデータにアクセスまたは無効にする有限状態コントローラーを使用して実装されます。バスに信号を送信することで他の CPU のブロックが無効になり、信号を送信することで他の CPU に読み取りまたは書き込みのロスが発生したことが通知されます。
ディレクトリ整合性プロトコルでは、各プロセッサには、キャッシュ可能な各ブロックのステータスを保存するディレクトリがあり、その情報には、どのキャッシュにこのブロックのコピーがあるか、ブロックを更新する必要があるかどうかなどが含まれます。メモリの各ブロックには、ディレクトリ内に対応するエントリがあります。各ディレクトリ エントリは、アクセス ステータスとビット ベクトルで構成されます。ビット ベクトルは、各プロセッサがブロックのコピーを持っているかどうかを記録します。ディレクトリ整合性プロトコルは、ブロードキャストを通じて他のプロセッサにブロック障害を通知するのではなく、ブロックが失敗したこと、またはビット ベクトルに基づいてブロックの更新作業が完了したことを、対応する CPU に通知します。そして、ブロックが配置されているメモリに属する CPU がホストとして機能し、通信が必要なプロセッサと通信し、書き込み失敗の通知と書き戻し操作を完了します。
2 つの方法の比較
リスニング方法はバスに基づいており、ブロードキャスト信号によって書き込み失敗を実装します。利点は、一貫性情報を維持するために追加のストレージ領域を必要としないことです。欠点は、スケーラビリティが低いことです。プロセッサの数が増えるほど、負荷が大きくなります。バス通信。
ディレクトリ方式では、集中ディレクトリを使用して一貫性情報を維持するため、ストレージのオーバーヘッドが増加します。ただし、整合性情報はディレクトリに集中的に格納され、ディレクトリ構造自体は分散されるため、拡張性があります。ディレクトリ方式の最大の利点は、分散システムで実装でき、バスを必要とせず、拡張性があることです。
付録 A
| A.2 命令セットアーキテクチャの分類
ストレージ タイプの分類によれば、命令セット アーキテクチャには次の 3 つのタイプがあります。
- スタックアーキテクチャ
- アキュムレータのアーキテクチャ
- 汎用レジスタ アーキテクチャ: オペランドはレジスタまたはメモリ位置です
- レジスタ メモリ アーキテクチャ: オペランドはメモリ アドレスにすることができ、プログラム サイズは小さいですが、命令の複雑さは異なり、完了までに必要なクロック サイクルも異なります。
- ロード/ストア アーキテクチャ (レジスタ/レジスタ アーキテクチャ): ロード/ストア命令のみがメモリにアクセスできます。命令の実行に必要なクロック数は同等であるため、命令のパイプラインが容易になりますが、プログラムのサイズは大きくなります。
| A.3-A.6 命令セットアーキテクチャの特徴
- アドレスとアドレッシング モードの説明: アドレスは、ビッグ エンディアンとリトル エンディアンの 2 つの方法で表現できます。通常、データのアドレス指定は調整されます。アドレッシング方法には、レジスタアドレッシング、イミディエイトアドレッシング、ディスプレースメントアドレッシング、ダイレクトアドレッシングなどがあります。アーキテクチャは、少なくとも最も一般的に使用されるレジスタ間接アドレッシング、ディスプレースメント アドレッシング、および即時アドレッシングをサポートする必要があります。
- オペランドの型とサイズ
- 命令セット内の演算: 一般に、少なくとも算術演算および論理演算、データ転送演算、制御演算、およびシステム演算をサポートします。
- 制御フロー命令: 条件付き分岐、ジャンプ、プロシージャ呼び出し、プロシージャリターン
- 命令セットのエンコーディング: 命令がパイプラインによって簡単に処理されることを期待して、できるだけ多くのレジスタとアドレッシング モードを許可し、命令の長さを制御します。
- 可変長エンコーディング: すべての操作に対してすべてのモードを許可します。パフォーマンスよりもコード サイズが重要
- 固定長エンコーディング: アドレッシング モードとオペランドが小さく、演算とアドレッシング モードがオペコードにマージされている場合に効果が高くなります。コードサイズよりもパフォーマンスが重要
- 混合エンコーディング
| RISC-V アーキテクチャ
RISC-V64Gを例として、この命令セットアーキテクチャの上記の特徴を紹介します。
-
レジスタ: RV64G には、32 個の 64 ビット汎用レジスタ、32 個の 64 ビット浮動小数点レジスタ、およびいくつかの特殊目的レジスタがあります。
-
オペランド: RV64G は、バイト、ハーフワード、ワード、ダブルワード、および単精度/倍精度浮動小数点をサポートします。
-
アドレッシング モード: データ アドレッシング モードは、即値アドレッシングとオフセット アドレッシングのみです。オフセットが 0 の場合、レジスタ間接アドレッシングが実装されます。RV64G は 64 ビット アドレスとリトル エンディアン ストレージを使用します。メモリ アクセスをアライメントする必要はありませんが、アライメントされていないメモリ アクセスを使用すると非常に遅くなります。
-
命令セットエンコーディング: 固定長エンコーディング。対応するアセンブリ形式は OP rd rs1 rs2 です。
- 操作: ロード ストレージ、ALU 操作、分岐とジャンプ、浮動小数点操作。
- 制御フロー命令: 分岐およびジャンプ命令。
付録 B
| B.2 キャッシュのパフォーマンスを評価する
キャッシュのパフォーマンス
メモリの一時停止時間は、キャッシュのパフォーマンスを評価するためによく使用されます。
もう 1 つのメトリックは、平均メモリ アクセス時間を使用することです。
キャッシュによる高速化率を計算する場合、キャッシュありとなしで CPI を計算し、高速化率を求めることができます。CPI の実行式ではメモリ ストールのみが考慮され、キャッシュがなければミス率は 100% になります。
キャッシュする際に考慮すべき 4 つの問題
- キャッシュ構成: フルアソシアティブ/グループアソシアティブ/ダイレクトマッピング
- キャッシュ ルックアップ: 物理アドレスを TAG|INDEX|BLOCK OFFSET に分割します。
- キャッシュ置換戦略: ランダム/LRU (通常は擬似 LRU のみが実装されます)/FIFO
- リテラシー戦略:
- 書き込み: 直接書き込み/ライトバック。ライトバックは高速であり、必要なのはキャッシュへの書き込みだけであり、使用するメモリ帯域幅が少なくなります。直接書き込みは実装が簡単で、次のレベルのストレージには常に最新のコピーが存在するため、データの整合性が簡素化されます。
- 書き込みがありません: 書き込みディスパッチ/書き込みディスパッチなし。ライトバック キャッシュでは、後続の書き込みがキャッシュによってキャプチャされることを期待して書き込みディスパッチを使用することがよくありますが、ライトスルー キャッシュでは、書き込みなしディスパッチが使用されることがよくあります。
| B.3 キャッシュのパフォーマンスを評価する
6 つの基本的なキャッシュ最適化方法:
- ブロック サイズを大きくしてミス率を低減します。ブロックが大きくなるとコールド ミスが減少し、空間的局所性が最大限に活用されますが、ブロックが大きすぎるとミス コストが増加し、他の 2 種類のミスが増加します。ブロック サイズの選択は、低レベル メモリの帯域幅とレイテンシによって決まります。高帯域幅でレイテンシが高いメモリの場合、大きなブロックを使用しても損失コストが増加することはほとんどないため、大きなブロックを使用することが推奨されます。プロセッサは低レイテンシで低帯域幅であるため、小さなブロックを使用することをお勧めします。
- キャッシュを増やしてミス率を減らします。キャッシュミスを減らすことができますが、ヒット時間が長くなり、コストと消費電力が増加する可能性があるという欠点があります。
- 関連度を上げて欠落率を減らす: 経験則では、8 方向のグループ関連付けは完全な関連付けと同じくらい効果的です。ただし、相関度を高めると欠損コストが増加します
- マルチレベル キャッシュを使用してミス コストを削減する: マルチレベル キャッシュを使用すると、キャッシュが高速化され、キャッシュ容量が拡張されます。マルチレベルキャッシュのミス状況を効果的に測定するために、ローカルミスレート(現在のキャッシュレベルのミスレート)とグローバルミスレート(キャッシュ全体のミスレート)が使用されます。一次キャッシュの速度はプロセッサのクロック周波数に影響し、二次キャッシュの速度は一次キャッシュのミスコストにのみ影響します。L2 キャッシュはミス率が高いため、より高い結合性とより大きなブロックを使用してミスを減らすことに重点が置かれています。
- 読み取りミスは書き込みミスよりも優先度が高く、ミスのコストが削減されます。書き込み後読み取り問題の場合、書き込みが完了しておらず、バッファーへの書き込みがまだ行われている場合、読み取りミスは最初に書き込みバッファーの内容をチェックできます。
- キャッシュのインデックス作成時にアドレス変換を回避 - ヒット時間の短縮: システムはキャッシュ内の仮想アドレスを使用してヒット時間を短縮できます。アドレス空間の保護やその他の理由を確実にするため、1 つの解決策は、ページ オフセットの一部を使用してキャッシュのインデックスを作成することですが、フラグの照合では引き続き物理アドレスを使用します。これにより、インデックスを使用してアドレス変換を実行しながら、キャッシュのインデックスを読み取ることができます。キャッシュ。
付録 C
| C.1 パイプラインの基本的な実装
命令の実行プロセスを 5 サイクルに分割し、各サイクルで新しい命令を開始して命令のパイプラインを実現し、次の点を採用します。
- メモリ アクセスの競合を避けるために、個別の命令キャッシュとデータ キャッシュを使用します。
- レジスタはクロック サイクルの前半に書き込まれ、後半に読み取られます。
- プログラム カウンタがインクリメントされ、分岐先アドレスが計算されます。
- パイプライン レジスタは、連続するパイプライン ステージでデータを転送し、すべてのレベルのデータが相互に干渉しないようにするために導入されています。
パイプライン化により CPU 命令のスループットは向上しますが、単一命令の実行時間を短縮することはできません。クロック速度は最も遅いパイプライン ステージよりも大きくする必要があり、パイプライン レジスタによってレイテンシーが発生するためです。
| C.2 合理化への障害 - 組立ラインアドベンチャー
パイプライン命令の実行は、主に次の 3 つのリスクを含むパイプライン リスクによって妨げられます。対応する解決策は次のとおりです。
- 構造的リスクテイク: リソースの競合によって引き起こされるリスクテイク。
- 一時停止
- ハードウェアを追加する (価値があるかどうかを検討する必要がある)
- 命令の並べ替え
- データハザード: データ依存によって引き起こされるパイプラインハザード。
- フォワード
- 一時停止
- 命令の並べ替え
- コントロールリスク: 分岐命令によって引き起こされるリスク。
- 基本的な予測メカニズム: チェック済み/チェックなしの予測、分岐遅延、静的分岐予測
- 動的分岐予測: 2 ビット分岐予測器
| C.3 パイプラインの実装
MIPS は分岐の計算と検出を ID 段階に移し、分岐のリスクによって引き起こされる一時停止を減らすことを期待しています。
ID ステージで分岐計算が完了すると、データリスクによってさらに停止が発生するため、RISC-V ではEX ステージで分岐判定を完了するように設計されており、分岐予測がない場合は 2 命令で終了します。これは 2 回の一時停止に相当します。RISC-Vでは動的分岐予測を採用しており、分岐遅延は必ずしも実現可能ではないため遅延スロットを使用せず、EXフェーズで分岐判定を完了し、IDフェーズで予測結果に基づいてジャンプし、検証を実行します。 EXフェーズ。
| C.7 基本的な動的スケジューリング - スコアボード
動的スケジューリング パイプラインでは、命令は順番に発行され、順番どおりに実行されません。これは、スコアボードを使用して実現されます。スコアボードは、すべての冒険検出タスクを含む、コマンドの起動と実行を完全に担当します。アウトオブオーダー実行により、元の順次実行パイプラインには存在しない WAR および WAW リスクが発生します。これらのリスクはスコアボードによって検出され、処理されます。各命令はスコアボードに入力され、レコードが作成されます。スコアボードは、いつオペランドを読み取って実行できるかを決定し、命令をいつターゲット レジスタに書き戻すことができるかを制御します。各機能コンポーネントには、スコアボード内のデータ パス (記録された場所) があります。
パイプラインで完了する命令には 4 つのステップがあります。
- 問題: 命令の機能ユニットが空いており、同じレジスタをターゲットとする他のアクティブな命令がない場合、命令はその機能ユニットに発行されます。WAW ハザードまたは構造的ハザードがある場合、コマンドの送信は停止します。
- オペランドの読取り: スコアボードはソース・オペランドの可用性を監視します。以前に発行されたどの命令もソース・オペランドに書き込んでいない場合、ソース・オペランドは使用可能です。この手順により、RAW ハザードが解決されます。
- 実行: 機能ユニットはオペランドを受け取った後に実行を開始し、結果が準備できたら、実行が完了したことをスコアボードに通知します。
- 結果の書き込み: スコアボードは機能ユニットの実行が完了したことを認識すると、WAR リスクをチェックし、必要に応じて命令の完了を停止します。
スコアボードには 3 つのセクションがあります。
- 命令ステータス: 命令が 4 つのステップのどのステップにあるかを示します。
- 機能ユニットのステータス: 機能ユニットのステータスを示します。Fj と Fk はソース レジスタ番号、Fi はデスティネーション レジスタ、Qj、Qk はソース レジスタを生成する機能ユニット、Rj と Rk はオペランドが準備完了かどうかを示します。
- レジスタ結果ステータス: どの機能ユニットがどのレジスタに書き込むかを示し、書き込みが完了するとフィールドは空になります。
|スコアボード記入フォーム
フォームに入力するとき、命令読み取りフェーズでは Rj と Rk はまだ読み取り可能状態にありますが、実行フェーズに入った後は読み取り可能に設定されます。ライトバック フェーズに入るとき、スコアボード内の命令の機能ユニット ステータス テーブルとレジスタ結果ステータス テーブルの対応する位置はクリアされます (ただし、この機能ユニットを使用する次の命令は、このサイクルでは発行できません。テーブル (オブジェクトは空) となり、同時にコンポーネントのオペランドを読み取る必要がある命令の Qj と Qk もクリアされ、Rj と Rk は YES 状態になり、読み取りの準備ができたことを示します。 , しかし、次の瞬間まで読むことができません。テーブルに記入するときは、clki テーブルは clki の終了時のステータスを示すため、命令がライトバックされ、その関数ユニットを使用する次の命令が同じサイクルで発行されるときに関数ユニットのステータスをクリアすることはできないことに注意してください。 。
次の図に示すように、最初の LD が clk4 に書き戻されます。このとき、Integer コンポーネントのエントリは空ですが、clk4 の最初の LD が書き戻され、エントリがこのサイクルでクリアされた事項。
さらに、次の図に示すように、コマンドは書き戻す前に WAR リスクがあるかどうかを確認する必要があります。