Upgrade to Pro — share decks privately, control downloads, hide ads and more …

「自作CPUでサイゼリヤ問題」を支える技術

 「自作CPUでサイゼリヤ問題」を支える技術

Ushitora Anqou

June 16, 2019
Tweet

More Decks by Ushitora Anqou

Other Decks in Programming

Transcript

  1. 「自作 CPU でサイゼリヤ問
    題」を支える技術
    艮 鮟鱇 @ushitora anqou
    1

    View full-size slide

  2. もう読んだ?
    「サイゼリヤで 1000 円あれば最大何 kcal
    摂れるのか」を自作 CPU 上で解いてみた
    |カオスの坩堝
    https://anqou.net/poc/2019/05/27/
    post-2920/
    2

    View full-size slide

  3. 計算機科学実験及演習 3(ハードウェア)
    FPGA 上にプロセッサをつくる
    • やばそう
    • わからん!w
    3

    View full-size slide

  4. 計算機科学実験及演習 3(ハードウェア)
    FPGA 上にプロセッサをつくる
    • やばそう
    • わからん!w
    実際わからん
    3

    View full-size slide

  5. 人に聞く
    @PiBVT と@fplwd には大変お世話になりま
    した
    4

    View full-size slide

  6. 4 月 30 日
    6

    View full-size slide

  7. 4 月 30 日
    6

    View full-size slide

  8. ハードウェア実験
    終了!w
    7

    View full-size slide

  9. ハードウェア実験
    終了!w
    7

    View full-size slide

  10. ソートコンテスト
    • 1024 個の符号付き 16bit 整数を昇順
    ソート
    • データセット:ランダム・昇順ソート済
    み・降順ソート済み
    • 実行サイクル数と動作クロック周波数
    から実行時間を計算
    最終デモでは応用プログラムの実行が必須
    8

    View full-size slide

  11. 「伝説」
    9

    View full-size slide

  12. 方針
    • 「伝説」は超えられない
    • c.f. ハードウェアロジック 0.04611ms
    • マルチコアはやりたくない
    • でも 1ms は切りたい
    10

    View full-size slide

  13. 1bit 幅基数ソート
    • 下位ビットから舐める
    • 上位ビットからでもいいらしいね。
    • 0 と 1 のバケツを作って順に並べる
    • 以上繰り返し
    • 時間計算量は O(n × k)
    アルゴリズムが単純で実装が楽そう
    11

    View full-size slide

  14. ソート実装のためアセンブラを開発
    でも普通のアセンブリは読みにくい……
    • ADD R0, R1⏎
    ST R0, 5(R1)
    ⇐⇒ R0 += R1⏎ [R1 + 5] = R0
    • CMP R0, R1⏎
    BLT loop
    ⇐⇒ if R0 < R1 then goto loop
    • 大抵の場合レジスタは変数一つに対応
    12

    View full-size slide

  15. ソート実装のためアセンブラを開発
    でも普通のアセンブリは読みにくい……
    • ADD R0, R1⏎
    ST R0, 5(R1)
    ⇐⇒ R0 += R1⏎ [R1 + 5] = R0
    • CMP R0, R1⏎
    BLT loop
    ⇐⇒ if R0 < R1 then goto loop
    • 大抵の場合レジスタは変数一つに対応
    もっと直感的に書けるようにする
    12

    View full-size slide

  16. examples/sort/radix sort1bit.s
    13

    View full-size slide

  17. 1位!
    (暫定)
    15

    View full-size slide

  18. 結果(再掲)
    259,065 サイクルかかる
    16

    View full-size slide

  19. サイクル数を減らす
    「伝説」以降の流行
    りに乗っかる
    17

    View full-size slide

  20. 1bit 幅基数+挿入ソート
    • 上位 m < k ビットを下位から 1bit 幅
    基数ソート
    • その後全体を挿入ソート
    • 計算量は O(n × m + n2)
    • ただし後半の n2 は実際には n の気分
    挿入ソートが「ほとんどソート済みの数
    列」に対して早いことを利用
    18

    View full-size slide

  21. examples/sort/radix1bit insert sort.s
    19

    View full-size slide

  22. 早いの?
    20

    View full-size slide

  23. 早いの?
    • 微妙
    • 実験すると m = 8 が一番早い
    • 理論値 11 万サイクルちょっと
    • 実機だともう少し悪くなる(未確認)
    どうする?
    20

    View full-size slide

  24. 2bit 幅基数ソート
    2bit の窓で値を見る (00/01/10/11)
    • 「どのバケツに属するか」を数サイク
    ルで判定可能
    • ループ処理サイクル数を 1bit のときと
    ほぼ同じに
    実装が煩雑なのでアセンブラを改造
    21

    View full-size slide

  25. examples/sort/radix sort2bit.s
    22

    View full-size slide

  26. 2bit 幅基数ソート
    時間計算量は O(n × k/2)
    • 単純計算で 1bit 幅基数ソートと比較し
    て 2 倍早い
    • ループ内処理を 1bit と同じ程度に抑え
    る必要
    • 実際は?
    23

    View full-size slide

  27. 10 万サイクルの壁
    • 挿入ソートと 2bit 幅基数ソートで実機
    は 10 万サイクルちょい(未確認)
    25

    View full-size slide

  28. 10 万サイクルの壁
    • 挿入ソートと 2bit 幅基数ソートで実機
    は 10 万サイクルちょい(未確認)
    基数ソートの幅を増やす
    25

    View full-size slide

  29. 最大幅は?
    FPGA 上の最大メモリサイズは 33792W
    • 愚直な kbit 幅基数ソートは
    (n × 2k+1)W 必要
    • n = 1024, k = 4 にて n × 2k+1 = 32768
    • ギリギリ載るけど……
    26

    View full-size slide

  30. 最大幅は?
    FPGA 上の最大メモリサイズは 33792W
    • 愚直な kbit 幅基数ソートは
    (n × 2k+1)W 必要
    • n = 1024, k = 4 にて n × 2k+1 = 32768
    • ギリギリ載るけど……
    4bit 幅基数ソートしたい
    26

    View full-size slide

  31. 工夫する
    • バケツのほとんどの空間は使わない
    • 4bit だけの処理なら半分の空間でいい
    27

    View full-size slide

  32. 工夫する
    • バケツのほとんどの空間は使わない
    • 4bit だけの処理なら半分の空間でいい
    =⇒ 4bit 処理するごとに値を詰め直す
    • 詰め直す処理は O(n) で比較的軽量
    27

    View full-size slide

  33. 工夫する
    • バケツのほとんどの空間は使わない
    • 4bit だけの処理なら半分の空間でいい
    =⇒ 4bit 処理するごとに値を詰め直す
    • 詰め直す処理は O(n) で比較的軽量
    ところで度数ソートって知ってる?
    27

    View full-size slide

  34. examples/sort/radix sort4bit.s
    28

    View full-size slide

  35. これを挿入ソートと組み合わせたい
    実装が煩雑なのが嫌
    • 「どこでどのレジスタが使われている
    か」なんて気にしたくない
    • アルゴリズム本体に注力したい
    引数付きマクロをいじる
    30

    View full-size slide

  36. examples/sort/radix4bit insert sort.s
    31

    View full-size slide

  37. これで実験は終わり……
    32

    View full-size slide

  38. これで実験は終わり……
    ShinyaKato さんの DP 解法がこの日の朝 4
    時頃に公開
    32

    View full-size slide

  39. とりあえず C で書く
    後々ハンドアセンブルしやすいように
    33

    View full-size slide

  40. とりあえず C で書く
    後々ハンドアセンブルしやすいように
    というのも
    33

    View full-size slide

  41. とりあえず C で書く
    34

    View full-size slide

  42. とりあえず C で書く
    • DP 配列を 2 本だけ持って交互に更新
    • 7 品のみ持つようにする
    • 正答は 3 品程度
    34

    View full-size slide

  43. 書けた
    ハンドアセンブルが難航
    35

    View full-size slide

  44. 一級フラグ建築士の鮟鱇氏
    36

    View full-size slide

  45. ところで
    世界の真相に気づく鮟鱇氏
    37

    View full-size slide

  46. フラグ回収
    38

    View full-size slide

  47. フラグ回収
    38

    View full-size slide

  48. インクリメンタルに開発
    39

    View full-size slide

  49. 割り切り設計
    とりあえずサイゼリヤが動けばいい
    • C の参考実装で必要な演算のみ実装
    • if の else 節が無い
    • 変数の宣言時初期化がない
    • 整数リテラルは-128〜127 のみ許容
    • すべての変数はメモリ上に割り付け
    • 変数を使うときはレジスタに LD して操
    作して ST する
    40

    View full-size slide

  50. コンパイラできた
    意外と早くできた。
    41

    View full-size slide

  51. コンパイラできた
    42

    View full-size slide

  52. プロセッサバグった
    シミュレーションがまともにできず地獄
    43

    View full-size slide

  53. 不満を並べる鮟鱇氏
    44

    View full-size slide

  54. @fplwd に手伝ってもらって完動
    45

    View full-size slide

  55. 食べに行った ※ オヌヌメしません
    46

    View full-size slide

  56. 記事は 1 万 PV/日を超えました
    • すべての閲覧者に感謝を。
    • Twitter とはてブのコメントはおおよ
    そ全部読んだつもり。
    • 「息を吐くようにコンパイラ作ってんの
    すげえなぁ。
    」が一番うれしかった。
    • 503 で落ちてて正直すまんかった。
    • 7 月から改善予定なので許して。
    48

    View full-size slide

  57. SIMPLE-arch-tools
    • 鮟鱇が開発した SIMPLE 用 toolchain
    • エミュレータ・アセンブラ・マクロア
    センブラ・コンパイラ・デバッガ
    • C 言語による単純な実装で改造容易
    • 詳細な usage.md・豊富な examples/
    • github.com/ushitora-anqou/SIMPLE-arch-tools
    ★スター★をください
    49

    View full-size slide

  58. 怪文書
    この演習は「ハードウェア実験」であって、アセンブラやエ
    ミュレータの開発はその目的に含まないはずである。にもか
    かわらず実際には、高性能なソートプログラムを作成するた
    めにはこれらの利用がほとんど必須であり、これらの開発に
    貴重な時間的リソースが割かれる。これは実験の本旨に照ら
    して由々しき問題であり、到底看過されるべきでない。次年
    度以降のハードウェア実験では、例えば拙作の
    SIMPLE-arch-tools のような過去の履修者が作成したツール
    チェインか、ないし講師陣が作成したツールチェイン等が、
    柔軟性のためそのソースコードを添付された形で、学生に対
    し頒布ないし提示されることを切に期待する。
    50

    View full-size slide

  59. まとめ
    鮟鱇がハードウェア実験をすると、
    ほとんどソフトウェア実験になる。
    51

    View full-size slide

  60. ご清聴
    ありがとうござ
    いました
    52

    View full-size slide