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

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

126139a2ee6a8e441e12208d0b6be790?s=128

Ushitora Anqou

June 16, 2019
Tweet

Transcript

  1. 6.

    5

  2. 11.

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

    • 実行サイクル数と動作クロック周波数 から実行時間を計算 最終デモでは応用プログラムの実行が必須 8
  3. 14.

    1bit 幅基数ソート • 下位ビットから舐める • 上位ビットからでもいいらしいね。 • 0 と 1

    のバケツを作って順に並べる • 以上繰り返し • 時間計算量は O(n × k) アルゴリズムが単純で実装が楽そう 11
  4. 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
  5. 16.

    ソート実装のためアセンブラを開発 でも普通のアセンブリは読みにくい…… • 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. 18.
  7. 19.
  8. 24.

    1bit 幅基数+挿入ソート • 上位 m < k ビットを下位から 1bit 幅

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

    早いの? • 微妙 • 実験すると m = 8 が一番早い •

    理論値 11 万サイクルちょっと • 実機だともう少し悪くなる(未確認) どうする? 20
  10. 30.

    2bit 幅基数ソート 時間計算量は O(n × k/2) • 単純計算で 1bit 幅基数ソートと比較し

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

    24

  12. 34.

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

    2k+1)W 必要 • n = 1024, k = 4 にて n × 2k+1 = 32768 • ギリギリ載るけど…… 26
  13. 35.

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

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

    29

  15. 48.

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

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

    36

  17. 57.

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

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

    47

  19. 65.

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

    • 「息を吐くようにコンパイラ作ってんの すげえなぁ。 」が一番うれしかった。 • 503 で落ちてて正直すまんかった。 • 7 月から改善予定なので許して。 48
  20. 66.

    SIMPLE-arch-tools • 鮟鱇が開発した SIMPLE 用 toolchain • エミュレータ・アセンブラ・マクロア センブラ・コンパイラ・デバッガ •

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