$30 off During Our Annual Pro Sale. View Details »

パタヘネの誤りを報告した話

msymt
June 27, 2020

 パタヘネの誤りを報告した話

msymt

June 27, 2020
Tweet

More Decks by msymt

Other Decks in Technology

Transcript

  1. パタヘネの誤りを報告した話 2020/06/27 MsY @py65criz

  2. 私について • 氏名:MsY • 所属:鳥取大学工学部電気情報系 学科コンピュータサイエンスコー ス • Twitter: @py65criz

    • 最近の悩み:研究が大変 • 最近の楽しみ:華金に飲むビール 2
  3. 今日話すことの概要 • 前半:訂正に至るまでの経緯 • 後半:訂正内容の解説 3

  4. 前半

  5. ある日 • 同研究室のメンバから 5

  6. パタヘネとは • パターソン&ヘネシー コンピュータの構成と設計 第5版上下 • 通称パタヘネ • コンピュータアーキテクチャ 理論を学ぶ教材として有名

    • 大体どこの大学でも教科書か 、補助教材として採用 6 出典:https://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E6%A7%8B%E6%88%90%E3%81%A8%E8%A8%AD%E8%A8%88-%E7%AC%AC5%E7%89%88- %E4%B8%8A%E4%B8%8B%E3%82%BB%E3%83%83%E3%83%88/dp/B079ZLXYQW/ref=pd_lpo_14_img_1/357-7670182-1649867?_encoding=UTF8&pd_rd_i=B079ZLXYQW&pd_rd_r=7318b4fb-ef47-4ff7-ae9d- 64e761f46ee1&pd_rd_w=WQ6Mq&pd_rd_wg=P62LZ&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=N00T98Q2K0TVKH80SFGH&psc=1&refRID=N00T98Q2K0TVKH80SFGH
  7. 著者について • デイビッド・アンドリュー・パターソン (David Andrew Patterson) ジョン・リロイ・ヘネシー (John LeRoy Hennessy)

    • 2017年にチューリング賞を受賞 • 計算機科学におけるノーベル賞 7
  8. 訂正した文 multuの場合はHiが0であれば、multの場合はHiの符号が Loと同じであれば、オーバフローは発生していない。 8

  9. 何をしたか 1. 友人と、誤りだと考える理由とその文面を用意(3日程) 2. 1の文面を、出版社の問い合わせフォームから送信 3. 編集者経由で、翻訳者の成田さんから返信 4. 2に対して返信 5.

    3,4を繰り返す(11日程) 6. パターソン教授が、原文に曖昧さがあるとして、 改訂文をご提示。 7. 最終的にこちらの主張が認められた 9
  10. その結果 • 日経BP社のHPに掲載 10 https://project.nikkeibp.co.jp/bnt/atcl/14/P98420/043000002/

  11. 完走した感想 • 書面だけで説得させるのは時間と手間がかかり、大変 • 期間:約2週間ほど • 論理に抜け穴がないよう、友人と吟味 • また間違いを発見したとしても報告しないと思う(面倒…) •

    大学生になって、少しは勉強したと言える(気がした • 言葉使いの勉強にもなった 11
  12. 後半

  13. 訂正内容について解説 13 これから話すこと • 計算機の仕組み • 2進数、10進数、補数 • MIPSについて

  14. 訂正内容について解説(準備編) 14 出典:SIMD化とは何か / Basics of SIMD, kaityo256, https://speakerdeck.com/kaityo256/basics-of-simd?slide=4

  15. 訂正内容について解説(準備編) 15 出典:SIMD化とは何か / Basics of SIMD, kaityo256, https://speakerdeck.com/kaityo256/basics-of-simd?slide=5

  16. 訂正内容について解説(準備編) 16 出典:SIMD化とは何か / Basics of SIMD, kaityo256, https://speakerdeck.com/kaityo256/basics-of-simd?slide=7

  17. 訂正内容について解説(準備編) 2進数 : 0と1を用いて数を表現 • 0、1、01、10、11、... 10進数 : 0~9を用いて数を表現 補数

    • 互いを足し合わせると、和が基数になる(or 0になる) • 基数:10進数では、10。2進数では2 • 7の10の補数:3。171の10の補数:829(1000 = 10の3乗) • 応用例:減算を加算で行える 17
  18. 訂正内容について解説(準備編) • コンピュータで減算をしたいが、 加算だけでどうにかしたい • そこで、補数を使う 18

  19. 訂正内容について解説(準備編) 6 - 3を計算したい • 減算を加算で表現したい =>3 の10の補数: 7 •

    6 + 7 = 13 • 最上位の桁「1」を消すと、3 19 9 - 3 6 +1 7 ਐ਺Ͱͷ ࠷େ஋ Λ଍͢ ϚΠφεͷ ୅ΘΓ
  20. 訂正内容について解説(準備編) 6 - 3 = 0110 - 0011を計算したい • 減算を加算で表現したい

    =>3の2の補数: 1101 0110 + 1101 = 10011 • 最上位の桁「1」を消すと、0011 = 3 • nの補数を用いて数を表現: nの補数表現 • 上記:2の補数表現 20 1111 - 0011 1100 +0001 1101 ਐ਺Ͱͷ ࠷େ஋ Λ଍͢ 0110 +1101 10011
  21. 訂正内容について解説(準備編) 2の補数表現する/しない の違い 4bitの場合 2の補数表現する:-8 ~ 7 • 正の数:0000(=0) ~

    0111(=7) • 負の数:1111(=-1) ~ 1000(=-8) 2の補数表現しない:0 ~ 15 • 0000(=0) ~ 1111(=15) 21
  22. 訂正内容について解説(準備編) 2の補数表現する:-8 ~ 7 • 正の数:0000(=0) ~ 0111(=7) • 負の数:1111(=-1)

    ~ 1000(=-8) 補数表現された場合、先頭bitが符号の代わりとなる • 0→+(プラス) • 1→-(マイナス) 22
  23. 訂正内容について解説(準備編) 1110 (2) • 2の補数表現する: -1 * 2^3 + 1

    * 2^2 + 1 * 2^1 + 0 * 2^0 = -8 + 4 + 2 = -2 • 2の補数表現しない: 1 * 2^3 + 1 * 2^2 + 1 * 2^1 + 0 * 2^0 = 8 + 4 + 2 = 14 23
  24. 訂正内容について解説(準備編) 2進数における乗算(4桁同士の乗算) • 6(10) x 3(10) = 0110 x 0011

    = 0001 0010 N bitとM bitの乗算は、(N+M)ビットで表される • 上記: 4 bit x 4 bit → 8 bit 24
  25. 訂正内容について解説(準備編) これまでに話したこと • 計算機 • 10進数、2進数、補数 • 2の補数表現 • 補数表現する場合と、しない場合

    25
  26. 訂正内容について解説(準備編) • MIPS(Microprocessor without Interlocked Pipeline Stages) • 命令セット・アーキテクチャの一種 •

    命令セット:コンピュータのハードウェアに命令を伝えるための言葉の 語彙 • 命令セットの具体例 • add : 加算、sub: 減算、mult: 乗算、div: 除算 • multu: 符号なし乗算 • u: unsigned(符号なし = 補数表現しない) • mult : 符号あり乗算(= 補数表現する) • 他にも沢山(書き込み、読み込みetc) 26
  27. 訂正内容について解説(準備編) • MIPSでは、64bitの積を保持するために、2つ1組の 32bitレジスタを割り当てている • 前半32bit: Hi レジスタ • 後半32bit:

    Lo レジスタ • MIPSにおける、オーバーフロー(桁溢れ)の定義: • 積が32bitを超える • multu(符号なし)、mult(符号あり)によって、判定方法が異な る 27 )J CJU -P CJU ੵ CJU
  28. 訂正前に従った場合 • 日本語訳(5版) multuの場合はHiが0であれば、multの場合はHiの符号が Loと同じであれば、オーバフローは発生していない。 • これに従い、調査 28

  29. 訂正前に従った場合 簡単にするため、4bit x 4bit の乗算を考える • 4bitで表現できる数 • 符号なしの場合:-8 ~

    7 • 符号ありの場合: 0 ~ 15 • 6 x 3 = 18 =>符号あり/なしに関わらずオーバフロー検知したい • 6(10) x 3(10) = 0110 x 0011 = 0001 0010 = 18 => Hi: 0001 Lo: 0010 29
  30. 訂正前に従った場合 • 「multuの場合はHiが0であれば、(中略)オーバフローは 発生していない。」 • 6(10) x 3(10) = 0110

    x 0011 = 0001 0010 = 18 • Hi: 0001、Lo: 0010 =>Hiが0ではないので、オーバフローを検知 =>問題なさそう? 30
  31. 訂正前に従った場合 • 「 (前略)multの場合はHiの符号がLoと同じであれば、オ ーバフローは発生していない。」 • Hi: 0001 Lo: 0010

    • HiとLoの符号は共にプラス(+) より、 オーバフローは発生していないと見なされる。 =>ここが間違えているのでは 31
  32. 原著に立ち返る • 原著(MIPS edition) There is no overflow if Hi

    is 0 for multu or the replicated sign of Lo for mult. • 私なりに翻訳するなら 「multuの場合はHiが0であれば、multの場合はHi(の各bit) がLoの符号と同じであれば、オーバーフローは発生してい ない。」 32
  33. 日本語訳の比較 [訂正前] • 日本語訳(5版) multuの場合はHiが0であれば、multの場合はHiの符号がLoと 同じであれば、オーバフローは発生していない。 • 私なりの翻訳 「multuの場合はHiが0であれば、multの場合はHi(の各bit)がLo の符号と同じであれば、オーバーフローは発生していない。」

    33
  34. 私の翻訳を交えた上での調査 • 6(10) x 3(10) = 0110 x 0011 =

    0001 0010 = 18 • Loの符号: 0、Hi: 0001より、オーバフローとして検知 • 全てのパターンを調査(割愛)し、他大学のpdfを調査 => 合ってそう 34
  35. 編集者からの返信 >今回の件を著者のお一人であるパターソン教授にメールでお聞きしました。 その回答が以下になります。 Sorry for the poor English sentence you

    had to translate. BEFORE: There is no overflow if Hi is 0 for multu or the replicated sign of Lo for mult. BETTER: There is no overflow if Hi is all zeros for multu or if each and all bits of Hi are the same as the sign of Lo for mult. パターソン教授は、原文に曖昧さがあったとして、改訂文を示してくださいました。 (後略) 35
  36. 訂正前と訂正後 • [訂正前] multuの場合はHiが0であれば、multの場合はHiの符号が Loと同じであれば、オーバフローは発生していない。 • [訂正後] multuの場合はHiのビットがすべて0であれば、multの 場合はHiのすべてのビットがLoの符号と同じならば、オ ーバフローは発生していない。

    36
  37. 訂正前と訂正後 • 私なりの翻訳 「multuの場合はHiが0であれば、multの場合はHi(の各 bit)がLoの符号と同じであれば、オーバーフローは発生 していない。」 • [訂正後] multuの場合はHiのビットがすべて0であれば、multの 場合はHiのすべてのビットがLoの符号と同じならば、

    オーバフローは発生していない。 37
  38. 今回のオチ • 後日、院試対策のために微分積分の問題演習を行っていた ところ、解説にて怪しい文言を発見 • 何度か確認し、メールで指摘 • 後日折り返し連絡がきて、本の解説が正しかったと判明 (めちゃくちゃ謝った) •

    報告するときは、慎重に • 他の人と確認しよう 38