1 / 31

マイクロプロセッサ

マイクロプロセッサ. 第 5 回. コンピュータにおける算術論理演算(その2). 関根 優年 田向 権. 乗 算. 1000 1001 1000 0000 0000 1000 1001000. 被乗数. ×. 乗数. 積. 2 進数の乗算. 乗算の各ステップ. 1.乗数の数字が1    ⇒ 被乗数と同じ値を適切な位置に書き記す. 2.乗数の数字が0    ⇒ 0を適切な位置に書き記す. 基本的な流れは 10 進数 の場合と同じ (長くなるので 4 ビットで記述 ).

shandi
Download Presentation

マイクロプロセッサ

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. マイクロプロセッサ 第5回 コンピュータにおける算術論理演算(その2) 関根 優年 田向 権

  2. 乗 算 1000 1001 1000 0000 0000 1000 1001000 被乗数 × 乗数 積 2進数の乗算 乗算の各ステップ 1.乗数の数字が1    ⇒ 被乗数と同じ値を適切な位置に書き記す 2.乗数の数字が0    ⇒ 0を適切な位置に書き記す 基本的な流れは10進数 の場合と同じ (長くなるので4ビットで記述) 非乗数がnビット、乗数がmビット  ⇒ 積は(n+m)ビット オーバーフローに注意 色々な計算法(アルゴリズム)がある 乗数、被乗数よりもビット数を必要

  3. 乗算アルゴリズムとハードウェアの第1のバージョン乗算アルゴリズムとハードウェアの第1のバージョン 開始 乗数の 最下位ビット=1 乗数の 最下位ビット=0 1.乗数LSB の値を判定 被乗数 左シフト 64ビット 乗数 右シフト 64ビット ALU 32ビット  1a. 被乗数を積レジスタに加え、 結果を積レジスタに収める 制御 積 書き込み 64ビット 2. 被乗数レジスタを1ビット左にシフト(桁上げ) 乗数レジスタ のLSBの値の判定 初期状態では 3. 乗数レジスタを1ビット右にシフト 積レジスタ 0 被乗数レジスタ  右半分 32ビットの被乗数  左半分 0 繰返回数 の判定 32回未満 32回 終了

  4. 例題) 第1の乗算アルゴリズム 4ビットの数値を用いて、 210x310(00102x00112)を計算せよ 例題) 開始 乗数の 最下位ビット=1 答) 乗数の 最下位ビット=0 1.乗数LSB の値を判定  1a. 被乗数を積レジスタに加え、 結果を積レジスタに収める 2. 被乗数レジスタを1ビット左にシフト 3. 乗数レジスタを1ビット右にシフト 繰返回数 の判定 32回未満 32回 計算結果は 000001102 = 610 終了

  5. 乗算アルゴリズムとハードウェアの改善バージョン乗算アルゴリズムとハードウェアの改善バージョン ハードウェアの改善バージョン 被乗数 32ビット 32ビット ALU 右シフト 積 制御 書き込み 64ビット 乗数レジスタ のLSBの値の判定 初期状態では 積レジスタ 左半分 0 右半分 乗数 第一バージョンでは、被乗数レジスタの半分が常に0 ← 64ビットALUが無駄(遅くもなる) ハードウェアの第1のバージョン 被乗数 左シフト 64ビット 乗数 右シフト 64ビット ALU 32ビット 制御 積 書き込み 64ビット 乗数レジスタ のLSBの値の判定 初期状態では 積レジスタ 0 被乗数レジスタ  右半分 32ビットの被乗数  左半分 0

  6. 第2と最終バージョン との比較 開始 積の 最下位ビット=0 積の 最下位ビット=1 1.積LSB の値を判定  1a. 被乗数を積レジスタの左 半分に加え、結果を積レジスタ を左半分に収める 2. 積レジスタを1ビット右にシフト 繰返回数 の判定 32回未満 32回 終了 開始 乗数の 最下位ビット=1 乗数の 最下位ビット=0 1.乗数LSB の値を判定  1a. 被乗数を積レジスタに加え、 結果を積レジスタに収める 2. 被乗数レジスタを1ビット左にシフト(桁上げ) 3. 乗数レジスタを1ビット右にシフト 繰返回数 の判定 32回未満 32回 終了

  7. 例題) 改善版の乗算アルゴリズム 例題) 4ビットの数値を用いて、210x310(00102x00112)を計算せよ 答) 計算結果は 000001102 = 610

  8. MIPSにおける乗算 64ビットの乗算結果(積)を保持するために、 2つの一組の32ビットレジスタ(Hi, Lo)を当てる。 MIPS命令 mult : 符号なし乗算(multiple)の命令 multu: 符号あり乗算(unsigned multiple)の命令 乗算結果をレジスタHi, Loから取り出す命令 mflo : move from lo 命令 mfhi: move from hi 命令 32ビットの乗算結果が欲しい場合は、mflo命令 オーバーフロー情報は、Hiレジスタにある  オーバーフロー発生がない multでは, Hi=0 multuでは, Hi=(Loと同じ符号情報)

  9. 除 算 2進数の除算 商 1001 1001010 -1000 0010 0101 1010 -1000 10 除数 被除数=商×除数 + 剰余 1000 被除数 除算の各ステップ 1.被除数の数字が1    ⇒ 除数を適切な位置にした値を       被除数から引く 剰余 2.被除数の数字が0    ⇒ 何もしない 基本的な流れは10進数 の場合と同じ (長くなるので4ビットで記述)

  10. 除算アルゴリズムとハードウェアの第1のバージョン除算アルゴリズムとハードウェアの第1のバージョン 開始 1. 剰余レジスタから除数レジスタを 引き、結果を剰余レジスタに収める 除数 右シフト 64ビット 剰余を判定 剰余<0 剰余≧0 商 64ビット ALU 左シフト 32ビット 2b. 剰余レジスタ+除数 レジスタ⇒剰余レジスタ 商レジスタを左シフトし、 右側の新しいビットを0 制御 剰余 2a. 商レジスタを 左シフトし、右側の 新しいビットを1 書き込み 64ビット 初期状態では 3. 除数レジスタを1ビット右にシフト 商レジスタ 0 剰余レジスタ  右半分 32ビットの被除数  左半分 0 繰返回数 の判定 33回未満 33回 終了

  11. 例題) 第1の除算アルゴリズム 710÷210(01112÷00102)を計算せよ 例題) 答) 商 3 剰余 1

  12. 除算アルゴリズムとハードウェアの改善バージョン除算アルゴリズムとハードウェアの改善バージョン 開始 除数 1. 剰余レジスタを1ビット左にシフト 32ビット 2. 剰余レジスタの左半分から除数レジスタを 引き、結果を剰余レジスタの左半分に収める 32ビット ALU 左シフト 剰余を判定 剰余<0 剰余≧0 剰余 制御 右シフト 書き込み 64ビット 3b. 剰余レジスタの左半分 +除数レジスタ⇒ 剰余レジスタの左半分 剰余レジスタを左シフトし、 右側の新しいビットを0 3a. 剰余レジスタを 左シフトし、右側の 新しいビットを1 初期状態では 剰余レジスタ  右半分 32ビットの被除数  左半分 0 繰返回数 の判定 33回未満 33回 終了 :剰余レジスタの左半分を1ビット右にシフト

  13. 例題) 改善版の除算アルゴリズム 例題) 710÷210(01112÷00102)を計算せよ 答) 商 3 剰余 1

  14. 符号付き除算 I 1)除数・被除数の符号を記憶させる. 2)両者の符号が異なる場合には、    絶対値に対する除算を行い,    商の符号を反転させる   → 剰余の符号をどうするかが問題     被除数 = 商 × 除数 + 剰余 被除数と除数の符号が違っても、演算で得られた 商と剰余の絶対値は変わらないでほしい 例) 7 ÷ 2       ⇒ 商 3, 剰余 1 (-7) ÷ 2    ⇒ 商 ー3, 剰余 -1 7 ÷(- 2)    ⇒ 商 ー3, 剰余 1 (-7) ÷ (-2) ⇒ 商 3, 剰余 -1

  15. 符号付き除算 II 除数と被除数の符合の積が商の符号となる,        剰余 = 被除数 - 商 × 除数  = -7 - (-3×2) = -1 しかし, = -7 - (-4×2) = +1 もある. こうならないように,     “被除数と除数の符号は同じでなければならない” という規則を適用する. ー(x÷y) と(-x)÷yも共に,同じように,絶対値 |x|÷|y| で計算して,後で,        商の符号=被除数の符号×除数の符号   を決めるようになる.  

  16. MIPSにおける除算 除算は基本的には乗算と同じハードウェアで実現 ⇒ 除算命令終了時、剰余 : 32ビットレジスタ(Hi) 商 : 32ビットレジスタ(Lo) MIPS命令 div : 符号なし除算(divide)の命令 divu: 符号あり除算(unsigned divide)の命令 除算結果をレジスタHi, Loに格納する命令(乗算と同じ) mflo : move from lo 命令(商) mfhi: move from hi 命令(剰余) オーバーフロー情報をソフトウェアで見知する必要あり。 それ以外に0による除算をチェックする必要あり

  17. 練習 • 2進数4桁の数値を適当に設定し,改善版のアルゴリズムを用いて乗算および除算を行え.

  18. 浮動小数点と科学記数法 数値演算には、小数の表現はどうする? 固定小数点 X = a+b 例) 44.125 (8ビット整数 、8ビット小数) b a 00101100 00100000 小数部分 整数部分 44 0.125 小数点の位置が固定 浮動小数点 固定小数点では、 表現可能な範囲が狭い X = b x 2a b a 指数部分 仮数部分 符号 次のような表記を2進法に適用する 小数点の位置が浮動 2.4888 x 1058 指数部分 仮数部分 正規化

  19. 浮動小数点表現形式の数値表現I IEEE754による表現:(-1)S x (1+仮数) x 2(指数-ゲタ) 単精度浮動小数点形式(32bit) (Cではfloat型に相当) LSB MSB ゲタ=127 S 指数 仮数 1bit 8bit 23bit 符号: Sは浮動小数点表現による数値の符号 仮数: 数値が0以外に必ず存在する先頭の1を仮数では持たない 指数: 2の補数表現のままでは,-1=11111111,1=00000001 であり,      最上位ビットで,指数の大小比較が出来ない.  ⇒  下駄を履かせる.      最も小さな負の指数を  0000…02に設定し、      最も大きな正の指数を  1111…12に設定する.

  20. 浮動小数点表現形式の数値表現II 倍精度浮動小数点形式(64bit) (Cではdouble型に相当) ゲタ=1023 S 指数 52bit 仮数 11bit 1bit 単精度(singleprecision)では28⇒256/2=128(10000000) が中心値  下駄は 128-1=127=01111111, 2128 = 3.4x1038 倍精度(doubleprecision)では, 211=2048/2=>1024が中心値, 下駄は 1024-1=1023,   21024 = 1.8x10308 これ以上の数値はオーバーフロー これ以下の数値はアンダーフロー

  21. 例題) 浮動小数点形式による表現 例題)-0.75を単精度、倍精度(IEEE754)で表現する 答) -0.75 = - (1 x 0.5 + 1 x 0.25) = -1.12 x 2-1 単精度 :S=1, 仮数=0.12, 指数=127-1=126 10111111 01000000 00000000 00000000 倍精度 :S=1, 仮数=0.12, 指数=1023-1=1022 10111111 11101000 00000000 00000000 00000000 00000000 00000000 00000000 例題)単精度(IEEE754)で表現する 11000000 10100000 00000000 00000000を10進数に 答) 単精度 :S=1, 仮数=0.012=0.25,指数=129 (-1)1 x (1+ 0.25) x 2(129-127) = -1.25x 4 = -5.0

  22. 浮動小数点加算 例) 9.99910×101 + 1.61010×10-1(仮数を4桁、指数を2桁と仮定した10進の例) ステップ1) 小数点の位置合わせ 9.99910×101 ⇒  9.99910×101 1.61010×10-1⇒  0.01610×101 指数が大きい方に合わせる ステップ2) 仮数の加算 9.99910×101 + 0.01610×101= 10.015× 101 ステップ3) 値の正規化 10.015× 101 = 1.0015× 102 ステップ4) 仮数の有効桁あわせ 1.0015× 102 ⇒ 1.002× 102 (四捨五入) もし、四捨五入して桁が増えた場合はステップ3へ

  23. 浮動小数点数の加算専用の算術演算ユニット

  24. IEEE754:浮動小数点表現 WilliamKahan 1953年トロント大学学部在学中にプログラムを習得 1960: IBM7090,FORTRANを利用 航空大学の大学院生が翼の安定性,失速の研究(シミュレーション) 単精度,倍精度でも結果は同じで,翼は失速した. Kahanが対数プログラムの新バージョンを作り,実行.   今度は,単精度でも,徐々に失速するとの結果が出た. IBM7090から7094に更新,倍精度浮動点小数ハードが不可.   倍精度で計算した時に限って,突然の失速が発生する. 解明には膨大な時間が必要であった.倍精度用のガード桁がなかった. ユーザは 1.0 - x の変わりに, (0.5 - x) + 0.5と記述してガード桁の不備を回避 参考:教科書196~206ページおよび3.10節

  25. 算術論理演算命令のデータパス 5 5 5 R形式命令(算術論理演算命令)のデータパス  レジスタを読出し、ALUで演算し、演算結果をレジスタに書き込む 6ビット 5ビット 5ビット 6ビット 5ビット 5ビット 必要となる論理要素 rs rt データ 読出 アドレス 読出 reg1 レジスタ ALU操作 3 レジスタ 番号 ALU 読出 アドレス 読出 reg2 ゼロ判定 書込 アドレス ALU ALU結果 書込 データ acm データ RegWrite

  26. データパスでの流れ 命令メモリ(レジスタファイル) PC ⇒ 6ビット 5ビット 5ビット 6ビット 5ビット 5ビット • どこかで命令が •  解読され, •  制御信号が •  出されている. • データ出力の •  ゲートを制御 •  する ALU操作 3 読出 アドレス 読出 reg1 レジスタ ゼロ判定 読出 アドレス ALU 書込 アドレス ALU結果 命令 読出 reg2 書込 データ RegWrite

  27. ロード/ストア命令のデータパス 32 16 必要となる 論理要素(追加分) 符号 拡張 MemWrite 読出 アドレス 読出 データ データ メモリ 書込 アドレス 書込 データ 例) lw $t1,offset($t2)  ($t2の値)+offsetを行う際に offsetを16ビットから32ビットに符号拡張 MemRead データパス ALU操作 3 読出 reg1 読出 reg1 レジスタ 命令 MemWrite ゼロ判定 読出 reg2 ALU 読出 データ データ メモリ 書込 reg アドレス ALU結果 読出 reg2 書込 データ 書込 データ RegWrite 符号 拡張 32 16 MemRead

  28. 命令の実行 • lwでメモリ内の機械命令を取り出す? • lwもメモリ内にある命令! • これをどうやって取り出す? 最初の命令を強制的に取り出して、実行する. 最初の命令はメモリ・アドレス‘0’番地にある.    その命令をメモリからレジスタにロードして実行する. その最初の命令を実行すると    プロセッサは次の命令をメモリからレジスタにロードして実行する. 0:lw $t0,1200($t1) jr$t0    ・・・・・・・・・・ 300:lw$t0,0($t2)

  29. マイクロプロセッサの始動 • 次に実行する命令のメモリのアドレス program counter(PC): • 最初の命令 =>PC=0ROMの最初の番地. • ブートローダー: BIOSの一部.マシーンを調べてOKならば、OSのカーネルをロード して、OSをロードして入力待ちになる.  レジスタ 命令 メモリ データ PC データ・ メモリ ALU アドレス レジスタ 番号 命令 アドレス レジスタ 番号 レジスタ 番号 データ

  30. 命令フェッチ • 命令を取り出すことをフェッチするという データパスの一部 命令フェッチRead(PC) PC=PC+4 加算 4 PC=4 命令 メモリ 命令アドレス PC レジスタ データ PC=0 レジスタ 番号 命令 レジスタ 番号 0:lw $t0,1200($t1) レジスタ 番号

  31. レジスタ データ レジスタ 番号 レジスタ 番号 レジスタ 番号 rs rt ALU rd 命令の解読 • レジスタにしまわれた命令の意味を解読する 0:lw $t0,1200($t1) opコードを調べて解読する ALUで実行する.

More Related