グループレビュー(3):合理化されたデータパス、パイプラインリスクの検出と処理

序文

昨日、シングルサイクルmipsパイプラインデータパスについて学び、ハードウェア構造が一連の制御信号を使用してさまざまな命令の差分処理を完了する方法を学びました。

ただし、命令実行プロセス全体がすべてのハードウェアを占有するため、シングルサイクルデータパスは理想的な状況です。実際、効率を上げるために、パイプライン化されたハードウェア構造は同時に最大5つの命令で共有され(mipsの5段階に対応)、データの整合性の問題が発生します。

パイプライン化されたデータパスは、中間キャッシュによってデータの競合を回避し、5段階のハードウェアを巧みに使用して論理的に分離し、パイプライン化された実行命令を真に実装します。


最初に読むことをお勧めします:

パイプライン思考

命令は論理的に5つの段階に分けられます。

  1. 命令フェッチ(IF)
  2. デコード(ID)
  3. 実行(EX)
  4. メモリアクセス(MEM)
  5. 書き戻し(WB)

どの命令にも5つのステップが必要なため、ハードウェアレベルから5つの異なるステージに分割できます。

ここに画像の説明を挿入
このように分割すると、コンポーネントがその作業を完了する限り、次の命令の対応する部分をすぐに実行できます。これにより、合理化の実現が可能になり、効率が大幅に向上します。

ここに画像の説明を挿入
注:たとえば以前のブログの地図を使用して洗濯をしています(怠惰すぎて新しい地図を描くことができません)

スピードアップ率

上の図に示すように、パイプラインの各ステージで費やされる時間が同じであり(1クロックサイクルであると仮定)、リスクがないと仮定すると(理想的)、次のようになります。

  • n個の命令のシリアル実行には5nサイクルが必要です
  • n個の命令のパイプライン実行にはn + 2サイクルが必要です(+2の理由を理解するには、上の図を参照してください)
  • スピードアップ率は5n÷(n + 2)= 5

各命令に費やされる時間が等しくなく、命令シーケンスが無限に長くない場合、スピードアップ率はさらに低下します。(スループットレートが低下し、+ 2を同時に無視できないため)

合理化されたデータパス

合理化とは、各コンポーネントが独立していることを意味しますが、逆効果になります。同じ命令の場合、次のステージのコンポーネントは常に前のコンポーネントの結果に依存します。

例としてIDステージとEXステージを取り上げます。EXステージは、操作のためにALUに入れる前に、IDステージで指定された制御信号とレジスタデータを必要とします。

例:命令1、2のパイプライン実行。実行は命令1のEXステージに達しており、命令1IDステージのデータが必要です。ただし、ハードウェアのセットが1つしかないため、この時点でIDコンポーネントに命令2のデータが入力されており、再度アクセスするとエラーが発生します。

ここに画像の説明を挿入
Smart Moffettは、異なるステージのそれぞれの間にキャッシュを追加することにより、設計者をミップし、呼び出しの次のステージのメンバーである前の命令操作の結果(データと制御信号を含む)を格納します。

ここに画像の説明を挿入
5つのステージがあるため、合計4つのバッファーを追加して、すべてのデータと制御信号のパスを完了することができます。

  1. IF / IDキャッシュ
  2. ID / EXキャッシュ
  3. EX / MEMキャッシュ
  4. MEM / WBキャッシュ


実際には、これらのキャッシュはレジスタです

lw命令のストリーミングデータパス

lw命令のパイプライン化されたデータパスを通して理解しましょう。次の図で、赤は書き込み意味し青は読み取りを意味します

最初はIFステージです。これは新しい命令であり、キャッシュを読み取る必要がないためです。命令バイナリコードを直接読み取り、同時にPC + 4を計算し、その結果をIF / IDキャッシュに書き込みます。

ここに画像の説明を挿入

次に、IDフェーズがあり、IF / IDキャッシュからIFフェーズの実行結果を読み取り、IDフェーズの実行結果を提供して、ID / EXキャッシュに格納します。ここでは、命令で指定された送信元と宛先のレジスタ番号を読み取り、レジスタから実際のデータを読み取ります。PCを渡すことを忘れないでください。以下に示すように:
ここに画像の説明を挿入

次に、EXステージが来て、前の操作を繰り返します(前のステージのキャッシュからデータを読み取り、実行結果を次のステージに書き込みます)。ここでは、ターゲットアドレスとイミディエートデータによって指定されたオフセットが読み取られ、次のステージで使用するメモリを読み取るためにEX / MEMキャッシュに送信されます。

ここに画像の説明を挿入
MEMステージでは、EXステージで計算されたアドレスをEX / MEMキャッシュから読み取り、メモリにアクセスして、取得したデータをMEM / WBキャッシュに書き込みます。
ここに画像の説明を挿入

WBステージはMEM / WBキャッシュを読み取り、ターゲットデータ(図の青い矢印)はMEM / WBキャッシュから同時に読み取られるLw命令は、lw宛先レジスタ番号(図の緑の矢印)を読み取り、次にターゲットレジスタ番号を読み取ります。データを正しいターゲットレジスタに書き戻します。以下に示すように:

ここに画像の説明を挿入

制御信号の送信

データと同様に、デコード段階で生成された9ビットの制御信号も逆方向に渡す必要があります。その中で

  • ALUSrc、RegDst、ALUOpはEXフェーズで使用されます
  • MemRead、MemWrite、およびBranchはMEMフェーズで使用されます
  • MemtoReg、RegWriteはWBフェーズで使用されます

データパスは、各レベルの必要な制御信号を段階的に逆方向に渡す必要があります
ここに画像の説明を挿入
。次の表に、この階層制御信号の転送関係を示します。
ここに画像の説明を挿入

データハザード

データハザードとは、2つの連続する命令1、2を指し、そのうち命令2は命令1の計算結果に依存するため、命令1のWBステージがターゲットレジスタから正しいデータを読み取るのを待つ必要があります。

私の以前のブログコンテンツについてここに引用しました(怠惰な:
ここに画像の説明を挿入

データハザードは、転送戦略によって解決できます。つまり、命令1のEXの直後に、データが命令2のEXステージに送信されるため、命令2は余分な待機なしに続行できます。

データハザード検出

データハザードには、次の2種類があります。

  1. データハザードは、タイプ1データハザードと呼ばれる2つの連続する命令の間に発生します
  2. 指示後も、タイプ2データハザードと呼ばれるデータハザードが発生します。

示されているように:

ここに画像の説明を挿入

上記のデータパスでキャッシュするという考えに従って、データの危険性を検出できるように、途中命令のソースレジスタと宛先レジスタ渡します。

タイプ1ハザード検出

まず、タイプ1のハザード、つまり、隣接する2つの命令間のデータハザードを見てみましょう。次のコードがあるとします。

指令1
指令2

次に、命令2のEXフェーズが実行される前に命令1のEXフェーズが実行されたの結果が必要ですデータパスによると、次のことがわかります。

  1. ID / EXキャッシュには、命令2のソースレジスタ番号が格納されます。
  2. EX / MEMキャッシュには、命令1の計算結果と命令1の宛先レジスタ番号が格納されます。

次に、[ID / EXキャッシュの送信元レジスタ番号]と[EX / MEMキャッシュの宛先レジスタ番号]が等しいかどうかを判断することで、タイプ1のデータリスクを検出できます。原則は次のとおりです。

ここに画像の説明を挿入

タイプ2ハザード検出

同様に、2つのタイプのデータハザードには同様の原則があります。2つの間隔を空けた命令の間にデータハザードが発生すると、コードは次のようになります。

指令1
指令2(无关指令)
指令3

命令3のEXステージには、命令1のEXの実行結果も必要です。次に、データパスから確認できます。

  1. 命令3がEXステージで実行され、命令1がMEMを完了し、WBステージに入る準備ができている場合、命令1の宛先レジスタ番号がMEM / WBキャッシュに存在している必要があります。
  2. 命令3がEXステージで実行されると、ID / EXキャッシュは命令3のソースレジスタ番号を伝送します。

したがって、[ID / EXバッファの送信元レジスタ番号]と[MEM / WBバッファの宛先レジスタ番号]が等しいかどうかを判断できるため、2種類のデータリスクを検出できます。原則は次のとおりです。

ここに画像の説明を挿入

完全なリスク判断

上記の考え方は、読み取りレジスタと書き込みレジスタが同じであるかどうかを判断することです。同じである場合、リスクが発生します。実際、Rタイプの命令とIタイプの命令はどちらも2つのレジスタのデータを読み取る必要があります。

ここに画像の説明を挿入

つまり、rsとrtが登録されると、各リスクを判断するには2つの状況、合計4つの状況が必要になります。

ここに画像の説明を挿入

ダブルアドベンチャー

ダブルアドベンチャーは、タイプ1とタイプ2の両方のアドベンチャーを同時に満たすことです。解決策は非常に単純です。つまり、タイプ1のアドベンチャー(EXでの経験)のみが発生せず、タイプ2のアドベンチャー( MEM)が実行されます。詳細な説明は次のとおりです。
ここに画像の説明を挿入

アクセス使用の冒険

データハザードとは異なり、「フェッチ使用」ハザードは、次の命令のソースオペランドが、前の命令によってメモリから読み取られたデータに依存することです。次に例を示します。

lw r2, 2(r3)
add r1, r1, r2

これは、EXの後にフォワードプッシュが発生しなくなることを意味します。逆に、フォワードプッシュ操作はフェッチ命令のMEMフェーズの後にのみ発生します。そして、それがどれほど進んでいても、それは常に1サイクル遅れます

ここに画像の説明を挿入
またはと:

lw r2, 2(r3)
add r1, r1, r2

例:とにかく1サイクル遅延する必要があるため、「フェッチ使用」リスクを判断するために追加命令EXまで待つことはできません。これは、IFコンポーネントとIDコンポーネントがすでに遅延なしに間違った操作を実行しているためです(つまり、追加実行後のシーケンス)命令)

それどころか、add命令のIDフェーズで「フェッチ使用」ハザードがあるかどうかの検出を開始する必要があります。判断によっても

  • キャッシュ内のID / EX、lw命令目的レジスタ番号rd
  • IF / IDバッファ、追加命令はrs / rtのソースレジスタ番号です

それらが等しいかどうか、「フェッチ使用」リスクが発生するかどうかを判断します。以下に示すように:
ここに画像の説明を挿入

ブロッキング処理

「フェッチ使用」リスクは間違いなくサイクルを遅らせます。パイプラインをブロックすることで達成します。次の3つのことを行います。

  1. ID / EXバッファでは、制御信号はすべて0に設定されているため、次のEX、MEM、WBはすべて操作なし(nop)です。
  2. PC、IF / IDキャッシュは変更されません

「フェッチ使用」のリスクを解決するためのパイプラインブロッキング+フォワードプッシュの図は次のとおりです。
ここに画像の説明を挿入
または:

lw r2, 2(r3)
add r1, r1, r2

例:IFの実行後、IF / IDキャッシュデータ(addに対応)とID / EXキャッシュデータ(lwに対応)がブロッキングユニットに転送され、ブロッキングユニットが「フェッチ」するかどうかを決定します。 -使用」リスクが発生し、次の図に示すように、PCをそのままにして1クロックサイクルをブロックします。
ここに画像の説明を挿入

ブランチアドベンチャー

mips分岐予測は決してジャンプしません。さらに、分岐命令は一般にbeqです。EXフェーズでは、ALUは2つのオペランドが等しいかどうかを計算し、制御信号を提供します。ただし、ブランチの実際の実行はまだMEM段階にあります。

MEMフェーズの理由については、私の以前のブログを読むことができます:グループ計画レビュー(2):単一サイクルのデータパスと制御信号
ここに画像の説明を挿入

これにはいくつかの命令のキャンセルが必要です。分岐命令がbeqから十分に離れている場合、最大3つの命令をキャンセルできます。beqはMEMステージにあるため、次のIF、ID、およびEXの3つのステージにはすべて3つの命令があり、最大で3つの命令しか存在できないことを意味します。

ブロッキングと同様に、すべての制御信号を0に設定します。

ここに画像の説明を挿入

割り込み例外

内側の幽霊はここでテストされると言いました。しかし、主にジャンプ後の割り込みサービスルーチンのアドレスが8000 00180であるため、注意する必要はないと思います。

ここに画像の説明を挿入

次に、パイプラインの全体像:

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_44176696/article/details/112471051