Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

5

Slide 7

Slide 7 text

4 月 30 日 6

Slide 8

Slide 8 text

4 月 30 日 6

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

「伝説」 9

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

examples/sort/radix sort1bit.s 13

Slide 18

Slide 18 text

結果 14

Slide 19

Slide 19 text

結果 14

Slide 20

Slide 20 text

1位! 15

Slide 21

Slide 21 text

1位! (暫定) 15

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

examples/sort/radix1bit insert sort.s 19

Slide 26

Slide 26 text

早いの? 20

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

examples/sort/radix sort2bit.s 22

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

24

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

examples/sort/radix sort4bit.s 28

Slide 40

Slide 40 text

29

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

examples/sort/radix4bit insert sort.s 31

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

とりあえず C で書く 34

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

書けた 35

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

36

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

フラグ回収 38

Slide 55

Slide 55 text

フラグ回収 38

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

コンパイラできた 42

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

不満を並べる鮟鱇氏 44

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

47

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

まとめ 51

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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