重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

こんにちは。コンピューターアーキテクチャのパイプラインの項目の勉強をしていて、データハザードについて分からない問題があったので、質問させていただきます。

以下の二つのパイプラインの動作がよくわかりません。


基本的にはフォワーディングによって解決するデータハザードですが、メモリアドレス生成のときはフォワーディングは間に合わないので、結果の格納(W)が終わらないと命令フェッチ(F)ができないそうです。つまり
add r1, r2 .r3    F D E W
lw r4, dpl(r1)         F X X DEW

となるそうです。しかし
ld r2, c(r1)
subi r1, r1, 4
のように「ロード命令の次に算術命令」という順番ですと、ハザードは生じないそうです。


下の場合は上と違いr1のデータを更新するだけなのでフォワーディングによって改善ができるという解釈でよろしいのでしょうか?
上は本に書いてあったものなのですが、下のはインターネットから調べたものなのであっていない可能性があるので質問しました。

ちなみに両者ともロード命令の場合なのですが、ストア命令でも同じような振る舞いになるのでしょうか?

よろしくお願いいたします。

A 回答 (3件)

「データハザード」ってのは, 端的にいうと「ある命令で得られた結果をそのあとの命令で使うために, 前の命令が終わるまで『あとの命令』の実行を止めなきゃならない」って状態.



ここに挙がっている例だと, 上のやつは add で得られた r1 を次の lw で使うから, 「r1 が得られるまで lw を実行できない」ということになる. ところが下の場合には ld の結果である r2 はそのあとで使わないから, ここで見えている分についてはハザードは生じていない (さらにあとの命令で r2 を使っていたら, ld とのタイミングでハザードが起きるかもしれん). あるいは,
ld r1, c(r2)
subi r1, r1, 4
なら明らかにハザードが起きる.

そして, はっきりいうと「ロードの場合はメモリからレジスタにデータを移すので算術命令のデータがメモリに書き込まれるまではストールしてしまう」というのは何をいっているのかよくわからん. もっというと「算術命令のデータがメモリに書き込まれる」とか「算術命令がメモリにデータを書き込む」とかの意味がわからん. どういうこと? どうせ MIPS かなんかの RISC なんだろうから, そもそも「算術命令の結果」がメモリに書き込まれることはありえないよ.

それぞれの命令を実行するために「確定していなければならないデータ」がなんなのか, そしてそれらが「どのタイミングで確定するのか」を確認してください. ここの例だと「add の結果がどこで出てきてどのタイミングにフォワーディングできるのか」とか「メモリアドレスをどのタイミングで生成するのか」とか, です.

とはいえ, 上の例で「どのステージが同時に起きているのか」がわからないんだよね.... add の D と lw の F が同じクロックと思っていい?

参考URL:http://akademeia.info/index.php?%A5%D1%A5%A4%A5% …
    • good
    • 0
この回答へのお礼

返事が遅れてしまい申し訳ありません。

おっしゃる通り、上の例でのステージはaddのDとlwのFが同じクロックです。そしてハザードが生じ、addのWの次のクロックにlwのDが来ています。

アドレスが生成されるので、算術命令の書き込みが完了しないとロード命令は実行できないと参考書に書いてあったので、算術命令によってメモリの書き込みがされるのかなと思っていました。それは間違いなのですね。


下の例についての解説ありがとうございます。非常にわかりやすいです。なにがいつ使われるということを意識するのが大切なのですね。

お礼日時:2011/07/05 19:40

下の例って, フォワーディングするまでもなくそもそもハザード起きてないよね. そこは理解できてる?



で, 今の例とは無関係だけど確かにフォワーディングすればハザードの解消はできる. ただ, 「ロードするための余計な時間」はどうしても必要だ (からストールの可能性は覚悟しなきゃならない) し, 「フォワーディングしてハザードを解消できるかどうか」は単に「必要なデータをいつ供給できるか」ということによる. それがわかっていれば「ストアのときにどうか」もわかるはずなんだけどね....
    • good
    • 0
この回答へのお礼

>下の例って, フォワーディングするまでもなくそもそもハザード起きてないよね. そこは理解できてる
正直微妙です。まだ算術命令でのデータの依存関係と混乱しています。


ロードの場合はメモリからレジスタにデータを移すので算術命令のデータがメモリに書き込まれるまではストールしてしまうという上の例の説明は言われて納得しました。
それを考えると、ストア命令の場合はレジスタからメモリにデータを書き込むので、算術命令がメモリにデータを書き込むまで待機している必要はないからハザードは起こらないと考えられると思っています。
しかし、メモリのどこにストアすればいいのかを確かめるために算術命令がメモリに書き込むまで待機する必要があるのかもしれないとも思っています。
つまり、まだ動作原理をしっかりと理解できていません。。。

お礼日時:2011/07/02 16:28

下の例で「ハザードは生じない」なら, そもそもフォワーディングの必要がない. つまり「フォワーディングによって改善ができる」と解釈する余地が存在しない.



どうも「データハザード」や「フォワーディング」の理解があやふやな気がする.
    • good
    • 0
この回答へのお礼

わかりにくい文章ですみません。

私は上の場合はアドレス生成なので、どうしてもハザードが生じてしまうが、下の場合はフォワーディングをすれば「ハザードは生じない」ということを言いたかったのです。

本題なのですが、「ロード命令の次に算術命令」という場合はフォワードィングによるハザードの改善は可能ということでよろしいのでしょうか?

よろしくお願いします。

お礼日時:2011/07/01 10:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!