2016-05-23 36 views
0

パイプラインに関する質問をしています。これは私が助けを必要とするものです。ロード命令の後にパイプラインが停止するが、追加命令の後にパイプラインが停止する

なぜロード命令の後にパイプラインストールが発生する可能性がありますが、追加命令 の後にはできません。

パイプラインの未使用スロットはパイプラインストールと呼ばれています。私の推測では、更新される可能性のあるレジスタを待つ必要があるため、ロード命令の後にパイプラインが停止する可能性があります。しかし、私はなぜ追加命令がパイプラインストールを作成できないのかについての答えを出すことはできません。おそらくそれはこの段階で既に登録簿から読んだからでしょうか?

+0

の追加は、多くの場合のみ1サイクルのレイテンシで、結果転送(別名バイパス)でそうすることができますaddは次の命令で使用できます。 [このQ&Aは関連するかもしれません(http://stackoverflow.com/questions/19041315/pipeline-stalling-and-bypassing-examples)、私はそれを読んでいませんでした。 –

答えて

2

パイプラインストールは、通常データ依存性によって引き起こされる危険を解決するために使用されます。 addはパイプラインストールを実際に生成することができますが、最初にパイプラインが停止しない例を考えてみましょう。

SUB r2, r3 
ADD r1, r2 

add命令は減算の結果を使用しますが、ストールはありません。これは、EXステージが前のEXステージからのデータにアクセスできるためです。

ここで、addがストールを生成する例を考えてみましょう。

LOAD r2, RAM[a] 
ADD r1, r2 

ここで、ロード命令からMEMステージによって生成されたデータは、ADD命令のEXステージによって入力として要求されます。 EXステージは、前のEXステージからのデータへのアクセスしか持たないため、ライト・ハザードの後に​​リードするためにパイプラインがストールします。このことは、(不可能である)時間的に逆方向にデータを伝達することなくデータ依存性を解決する。これは、(NOPのような)パイプラインに気泡を導入することによって解決される

この図に示されています。

enter image description here

あなたは、hazards上に読み込むことでかなり詳細にこれについての詳細を学ぶbubbles、およびforwarding

+0

addによって消費されている負荷からのデータは実際にはストールを生成する 'add'ではなく、IMOです。私は負荷が消費者ではなく負荷にあると思います。なぜなら、負荷はALU操作より後でパイプラインで結果を生成するからです。 –

+0

また、ロードアドレスは、従来のRISCパイプラインのこの例のEXステージで準備する必要がありますか、またはMEMステージからMEMステージにロードされたデータをMEMステージに戻すだけで1C遅延でポインタチェイスできますか? –

+0

@PeterCordes私は追加がストールを起こしていると主張します。命令がなければ、ストールは発生しないからです。ストールは、データ依存性を引き起こす命令によって生成されます。 add命令を削除した場合、ストールは発生しません。したがって、私は「追加」がストールを生み出すと主張するだろう。あなたの2番目の質問については、オペランド転送でポインタ追い越しが可能になりました。 「EX」ステージが前の「EX」ステージからデータを読み取るのと同じ方法で、「MEM」ステージは前の「MEM」ステージからデータを読み取ることができます。 –

関連する問題