Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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