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

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

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

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

Avatar for Ushitora Anqou

Ushitora Anqou

June 16, 2019
Tweet

More Decks by Ushitora Anqou

Other Decks in Programming

Transcript

  1. 5

  2. ソートコンテスト • 1024 個の符号付き 16bit 整数を昇順 ソート • データセット:ランダム・昇順ソート済 み・降順ソート済み

    • 実行サイクル数と動作クロック周波数 から実行時間を計算 最終デモでは応用プログラムの実行が必須 8
  3. 1bit 幅基数ソート • 下位ビットから舐める • 上位ビットからでもいいらしいね。 • 0 と 1

    のバケツを作って順に並べる • 以上繰り返し • 時間計算量は O(n × k) アルゴリズムが単純で実装が楽そう 11
  4. ソート実装のためアセンブラを開発 でも普通のアセンブリは読みにくい…… • ADD R0, R1⏎ ST R0, 5(R1) ⇐⇒

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

    R0 += R1⏎ [R1 + 5] = R0 • CMP R0, R1⏎ BLT loop ⇐⇒ if R0 < R1 then goto loop • 大抵の場合レジスタは変数一つに対応 もっと直感的に書けるようにする 12
  6. 1bit 幅基数+挿入ソート • 上位 m < k ビットを下位から 1bit 幅

    基数ソート • その後全体を挿入ソート • 計算量は O(n × m + n2) • ただし後半の n2 は実際には n の気分 挿入ソートが「ほとんどソート済みの数 列」に対して早いことを利用 18
  7. 早いの? • 微妙 • 実験すると m = 8 が一番早い •

    理論値 11 万サイクルちょっと • 実機だともう少し悪くなる(未確認) どうする? 20
  8. 2bit 幅基数ソート 時間計算量は O(n × k/2) • 単純計算で 1bit 幅基数ソートと比較し

    て 2 倍早い • ループ内処理を 1bit と同じ程度に抑え る必要 • 実際は? 23
  9. 24

  10. 最大幅は? FPGA 上の最大メモリサイズは 33792W • 愚直な kbit 幅基数ソートは (n ×

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

    2k+1)W 必要 • n = 1024, k = 4 にて n × 2k+1 = 32768 • ギリギリ載るけど…… 4bit 幅基数ソートしたい 26
  12. 29

  13. とりあえず C で書く • DP 配列を 2 本だけ持って交互に更新 • 7

    品のみ持つようにする • 正答は 3 品程度 34
  14. 36

  15. 割り切り設計 とりあえずサイゼリヤが動けばいい • C の参考実装で必要な演算のみ実装 • if の else 節が無い

    • 変数の宣言時初期化がない • 整数リテラルは-128〜127 のみ許容 • すべての変数はメモリ上に割り付け • 変数を使うときはレジスタに LD して操 作して ST する 40
  16. 47

  17. 記事は 1 万 PV/日を超えました • すべての閲覧者に感謝を。 • Twitter とはてブのコメントはおおよ そ全部読んだつもり。

    • 「息を吐くようにコンパイラ作ってんの すげえなぁ。 」が一番うれしかった。 • 503 で落ちてて正直すまんかった。 • 7 月から改善予定なので許して。 48
  18. SIMPLE-arch-tools • 鮟鱇が開発した SIMPLE 用 toolchain • エミュレータ・アセンブラ・マクロア センブラ・コンパイラ・デバッガ •

    C 言語による単純な実装で改造容易 • 詳細な usage.md・豊富な examples/ • github.com/ushitora-anqou/SIMPLE-arch-tools ★スター★をください 49