パイプラインハザードとは?CPUのパイプライン処理で起こる問題とは?

このQ&Aのポイント
  • パイプラインハザードとは、CPUのパイプライン処理において起こる問題のことです。具体的には、データ依存や資源依存、制御依存によって処理の順序が崩れ、正しく処理が行われないことがあります。
  • この質問では、C言語で書かれたコードをコンパイルし、機械語に翻訳した結果を示しています。そして、この機械語をパイプライン処理する場合に起こる可能性のあるパイプラインハザードを説明し、それを回避するための修正方法についても述べられています。
  • 具体的な回答については、質問文章の内容を詳しく読んでください。また、ハッシュタグとしては「パイプラインハザード」「CPU」「処理順序」といったキーワードが考えられます。
回答を見る
  • ベストアンサー

パイプラインハザード

(2)パイプラインハザードに関する以下の問いに答えよ。C言語で図1のコードをコンパイルしたところ図2のような機械語に翻訳された。変数のメモリマップは図3を参照せよ。 (a)CPUがこの機械語をパイプライン処理している場合に、どのようなパイプラインハザードがありうるか説明せよ。 (b)上記のパイプラインハザードを回避するために、図2の機械語を一部修正した機械語を記せ。その際、なぜハザードが回避できるのか説明せよ。 図1:C言語による演算コード A=B+C D=B+E 図2:図1のコードを翻訳した機会コード LOAD R1 SO(4) LOAD R2 SO(8) ADD R3 R1 R2 STORE SO(0) R3 LOAD R2 SO (16) ADD R3 R1 R2 STORE SO(12) R3 図3:変数のメモリマップ   SO→|AAAA|   |BBBB|   |CCCC|   |DDDD|   |EEEE| データ依存、資源依存、制御依存のどれかによるものだと思うのですが、全く検討がつきません。ご教示お願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.2

この質問に対する回答ではありません。 > スーパースカラーは命令待ちの遅延時間を短縮する方法ですし、 > 1クロック単位の命令実行速度そのものは向上しません。 http://okwave.jp/qa/q8159131.html の回答No.2 スーパースカラというのは次のような技術であるのに, http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9 質問者は,正解の候補としてスーパースカラを除外することに「ありがとうございます!納得しました。」とのこと。参考までに,なぜ納得できたのか,お聞かせいただけるとありがたいです。

hadid_zah
質問者

お礼

いつもご回答ありがとうございます。 いつも参考にさせて頂いております。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

パイプラインの構成は?

hadid_zah
質問者

補足

パイプラインに関する記述は特にありません。

関連するQ&A

  • パイプラインハザード2

    パイプラインハザードに関する以下の問いに答えよ。C言語で図1のコードをコンパイルしたところ図2のような機械語に翻訳された。変数のメモリマップは図3を参照せよ。 図1:C言語による演算コード A=B+C D=B+E 図2:図1のコードを翻訳した機会コード LOAD R1 SO(4) LOAD R2 SO(8) ADD R3 R1 R2 STORE SO(0) R3 LOAD R2 SO (16) ADD R3 R1 R2 STORE SO(12) R3 図3:変数のメモリマップ   SO→|AAAA|   |BBBB|   |CCCC|   |DDDD|   |EEEE| (a)CPUがこの機械語をパイプライン処理している場合に、どのようなパイプラインハザードがありうるか説明せよ。 データハザードがというデータ依存によって起こるパイプラインハザードが起こる。データ依存とは、命令1の結果を後の命令2が使用する場合に生じるものである。命令2が処理されるためには命令1の完了を待たなければならず、待ちが生じる。 図2の機械語コードから 命令に上から順に00,01,02,03,04,05,06という番号をつけると01,02ではR2を共有しているため02は01の完了を待たなければならず待ちが生じる。他も02,03はR3を、04,05はR2を、05,06はR3を共有しているため待ちが生じる。それによってパイプラインに乱れが生じ、命令作業がスムーズに行われなくなる。 という答えになりました、ご確認お願い致します。 (b)上記のパイプラインハザードを回避するために、図2の機械語を一部修正した機械語を記せ。その際、なぜハザードが回避できるのか説明せよ。 命令追越し機能を利用するものかなと思ったのですが...はっきりとした答えがみつかりません。 ご教示お願い致します。

  • データハザードについて(パイプライン)

    こんにちは。コンピューターアーキテクチャのパイプラインの項目の勉強をしていて、データハザードについて分からない問題があったので、質問させていただきます。 以下の二つのパイプラインの動作がよくわかりません。 基本的にはフォワーディングによって解決するデータハザードですが、メモリアドレス生成のときはフォワーディングは間に合わないので、結果の格納(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のデータを更新するだけなのでフォワーディングによって改善ができるという解釈でよろしいのでしょうか? 上は本に書いてあったものなのですが、下のはインターネットから調べたものなのであっていない可能性があるので質問しました。 ちなみに両者ともロード命令の場合なのですが、ストア命令でも同じような振る舞いになるのでしょうか? よろしくお願いいたします。

  • パイプライン制御(ハザード検出の仕組み)

    最近独学で計算機アーキテクチャーについて勉強しております。 本を読んでいたらパイプラインのところで「データハザードはパイプライン・インターロックというハードウェアで検出される」という記述があったのですが、これについてもう少し詳しく知りたいです。 具体的には、例えば以下のような命令列があった場合、 i1: ADD R4=R1+R2 i2: ADD R5=R4+R3 データハザードの検出により、(バイパスがなければ)以下のようにストール(ST)が挿入されます。 i1: ADD R4=R1+R2 IF ID EX MA WB i2: ADD R5=R4+R3   IF ST ST ST ID EX MA WB この「データハザードの検出(テスト)」というのはどのようなタイミングで行われるのでしょうか? (a)1回テストして検出された場合すぐに上のような対処(STを3つ挿入)が行われるのでしょうか? それとも (b)1回テストして検出された場合、STが1つ挿入される。再度テストしてまた検出された場合、STがもう1つ挿入される... という具合にして正しい対処にたどりつくのでしょうか? あるいは (c)他の仕組みによるのでしょうか? どうぞよろしくお願いいたします。

  • ターミナル: パイプラインで検索

    あるASCIIファイルに、 Name A B C D T.O 4 3 2 3 C.K 2 1 2 5 . . . というように名前とスコアが記入されていて、 このファイルから、 Dの点数が一番高かった人は誰で、 その人のAの点数は何番目だったか、 という操作パイプラインを使って一行のコマンドで実行したいのですが、うまくいきません。 自分で考えたのは、 ●Dの点数が一番高かった人 $ sort -k 5 -n -r exam | head -n 1 ●D点数が一番高かった人(をE.Tとすると)のAの順位 $ sort -k 2 -n -r exam | grep -B 101 E.T | wc -l という感じなのですがどうやって一緒にするのか分かりません… (全くやり方が違うかも知れないですが(^_^;)) どなたか教えてください(>_<)

  • プログラム制御

    既存のプログラムが有り解読を行っていますが理解不明です。ご教示を宜しくお願いします。コード内容は、 LOAD A (=6000) - B (=1500) STORE C (A-B→C) LOAD D (=350) - E (=10) STORE F (D-E→F) / C STORE G (F/C→G) * B + D STORE H ((G*B)+D→H) 本プログラムはモータのPID制御を行っており、その一部のコードです。 内容としては、一次方程式を形成し変動割合を導出しているのかと考えましたが一次方程式では+Dのコードが+Eであると思われます。 何を形成しているのでしょうか。

  • c言語のプログラムをアセンブリに変換する質問です

    c言語のプログラムをアセンブリに変換する質問です http://www5.si.gunma-u.ac.jp/sado/compiler/ex08/ex5.pdf 上記のアドレスの5番の問題です 私が考えたコードがこれなのですが正解がないので あっているかどうか心配です 実行環境がある方、もしくはアセンブリコードに 詳しい方チェックをお願いします load r4 , #0 ## d = 0 load r1 , a ## r1 = a load r3 , c ## r3 = c cmp r1 , r4 ## a > d → a > 0  jg Label ## a > 0 でないならLabelに分岐 mul r1 , r3 , r2 ## b = a * c; sub r1 , r3 , r4 ## d = a - c jmp Label2 ## Label2へ分岐 Label : mul r1 , r3 , r4 ## d = a * c sub r4 , r1 , r2 ## b = a * c - a add r1 , r3 , r4 ## d = a + c = d Label2 : mul r2 , r4 , r1 ## a = b * d

  • 必要なソースコードのみを抽出

    数百MBに及ぶソースコードがあります。モジュールAのみを使う時、AがBを依存しています、BがCを依存しています、Cは・・・となり、結局全部コンパイルする羽目になります。 実際のところ、AはBの1関数のみ利用しており、Bのその他無関係の関数がCを依存しています。 モジュールAをうまく抜き出す方法はありませんか。言語はC、C#、VB、各言語単位で出来れば十分です。。

  • 機械語を用いて2のx乗を求める

    機械語を用いて2のx乗を足していったものを作りたいです。 1+2+4+8+16~~~2^x となる感じです。 xはこちらからあらかじめ入力してあるということにしています。 一応途中まではできました。 命令とオペランドだけを書くと、 LD A,(9000H) LD C,01 LD B,A LD A,00 SLA C LOOP ADD A,C DEC B JP NZ,LOOP LD (9100H),A HALT ここまではできたのですが、 これだと0を代入した際答えが正しく出ませんでした。 習っている内容もまだ始めたばかりなので、 LD、ADD,SUB、DEC,INC、JP(NZ)、SLA.SRA、SRLなどのものしか習っておらず、 他の者は使わないようにと言われています。 どこを直せばいいでしょうか?

  • 機械語

    番地機械語ニモニック表記コメント 0 11101000 Shift 8 ;無駄な命令.ただしAccumulatorの内容は0になる 1 10011111 Store 31 ; Accumulator の内容を31 番地へ格納 2 01100001 Load 1 ; 1 番地のデータ(Store 命令) をAccumulator へ 3 01000110 Sub 6 ; 6 番地の内容(= 1) をAccumulator から引く 4 10000001 Store 1 ; 引いた結果を1 番地に格納 5 01100111 Load 7 ; 7 番地の内容(= 0) をAccumulator へ 6 00000001 Jump 1 ; 1 番地にジャンプする 7 00000000 0 ; 0 データの保管場所 このプログラムが停止するのはどんなときですか? これを実行したら3分くらい止まらなかったのですが・・・

  • アイムジャグラー設定6を3000G回してみました。

    アイムジャグラー設定6を3000G回してみました。 187 R 97 R 203 B 72 R 32 R 164 R 36 B 194 C+B 137 B 121 C+B 643 C+B 254 C+B 17 C+B 57 C+B 113 B 86 B 156 R 179 R 192 R 11 C+R 20 ヤメ ブドウ 1/6.13 チェリー 1/36.14 重複率 : 8.4326% BIG11回 : 1/272.72 REG9回 : 1/333.33 BONUS : 1/150.00 差枚 : +338 機械割 : 103.75% 設定6でもこれだけしか返ってこないということは、 長期的に打つよりも、短時間で2k枚程出たら撤収するのが ジャグラーで稼ぐ方法でしょうか。