Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
MN-Core2 上でのFizzBuzzゴルフ実装
Search
Preferred Networks
PRO
September 26, 2024
Programming
0
92
MN-Core2 上でのFizzBuzzゴルフ実装
2024/08/28- 2024/09/23 に開催した MN-Core Challenge の参加者による、最終問題の解説の資料です。
Preferred Networks
PRO
September 26, 2024
Tweet
Share
More Decks by Preferred Networks
See All by Preferred Networks
Kubernetes における cgroup v2 でのOut-Of-Memory 問題の解決
pfn
PRO
0
420
Preferred Networks (PFN) とLLM Post-Training チームの紹介 / 第4回 関東Kaggler会 スポンサーセッション
pfn
PRO
1
300
AIベンダーにおけるAIセキュリティ・ガバナンスへの取組
pfn
PRO
1
93
オフィス環境及び機械学習向けKubernetesクラスタでのAkamai SIA(DNS ファイアウォール)活用事例
pfn
PRO
0
96
Deploying PLaMo 2 with vLLM: A Practical Guide / vLLM roundup Community Meetup Tokyo
pfn
PRO
1
460
New Cache Hierarchy for Container Images and OCI Artifacts in Kubernetes Clusters using Containerd / KubeCon + CloudNativeCon Japan
pfn
PRO
0
280
Preferred Networks金融チームのご紹介
pfn
PRO
4
2k
KubeCon + CloudNativeCon Europe 2025 Recap: The GPUs on the Bus Go 'Round and 'Round / Kubernetes Meetup Tokyo #70
pfn
PRO
0
300
LLMの開発と社会実装の今と未来 / AI Builders' Community (ABC) vol.2
pfn
PRO
3
740
Other Decks in Programming
See All in Programming
testingを眺める
matumoto
1
130
Processing Gem ベースの、2D レトロゲームエンジンの開発
tokujiros
2
120
More Approvers for Greater OSS and Japan Community
tkikuc
1
100
250830 IaCの選定~AWS SAMのLambdaをECSに乗り換えたときの備忘録~
east_takumi
0
350
DockerからECSへ 〜 AWSの海に出る前に知っておきたいこと 〜
ota1022
5
1.9k
rage against annotate_predecessor
junk0612
0
140
LLMOpsのパフォーマンスを支える技術と現場で実践した改善
po3rin
8
1k
Portapad紹介プレゼンテーション
gotoumakakeru
1
130
テストカバレッジ100%を10年続けて得られた学びと品質
mottyzzz
2
330
AIでLINEスタンプを作ってみた
eycjur
1
220
Google I/O recap web編 大分Web祭り2025
kponda
0
2.9k
サイトを作ったらNFCタグキーホルダーを爆速で作れ!
yuukis
0
730
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
696
190k
The Cult of Friendly URLs
andyhume
79
6.6k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
30
9.6k
How to train your dragon (web standard)
notwaldorf
96
6.2k
Designing for Performance
lara
610
69k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
A better future with KSS
kneath
239
17k
The Cost Of JavaScript in 2023
addyosmani
53
8.9k
4 Signs Your Business is Dying
shpigford
184
22k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Designing for humans not robots
tammielis
253
25k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.5k
Transcript
MN-Core2上でのFizzBuzzゴルフ実装 angel_p_57(X/twitter) @2024/9/25 MN-Core Challenge懇親会
自己紹介 • 自称 angel、各種IDには p57 つけてます • SNS: X(Twitter)上で主に活動、へのへのもへじネコが目印 •
本業はBrainf**ker ※Brainf**k案件のオファーはまだありません!! • メシの種としてしがないIT技術者やってます • 1タイトル特化でゲーム攻略・RTAもやってます (SFC/セプテントリオン) • 今回総合5位(!) FizzBuzz最短は最終日に抜かれました…
挑戦の経緯
時系列 • 「FizzBuzz?絶対大変じゃん、やる余裕ないのでは?」 • 「あ、なるほどこれ Count Upの類題だ」 • 「カーネル(コア部分実装)組めればワンチャン勝負になる?」 •
150行程度の見積もりでカーネル考案→「勝負するか!」 ※その時はtailsさんの195行実装のみ • 143行で最初の提出(最終日前日早朝) ※ついでに折角だし解説やっとくかと決意 • ちょこちょこ直して112行でフィニッシュ • コンテスト終了直後、最短抜かれてることを知る…
基本アイデア
Count UpとFizzBuzzの類似性 • Count Up PEの位置を元に連番ブロックを 生成 • FizzBuzz PEの位置を元にFizzBuzzの8
文字ブロックを生成 1,2 3,4 5,6 7,8 ・・・ 1n2n Fizz n4nB uzzn Fizz n7n8 nFiz znBu ・・・ L2B L2B L2B L2B L2B L2B L2B L1B MAB PE PE PE PE
つまり、 全体の8文字ブロックの位置から FizzBuzzの8文字分を計算 →ブロック化FizzBuzz(仮)の実現
今回のコンセプト 処理を単純化・共通化すること ※SIMDなので あんまり複雑なこと 考えられなかったともいう…
FizzBuzzの規則性 • FizzBuzzの規則性に着目 ◦ 15周期で、数字/Fizz/Buzz/FizzBuzzが繰り返す → FizzBuzz小ブロック ※微妙に8文字ブロックとズレる ◦ 120周期で、8文字ブロック開始位置も繰り返す
→ FizzBuzz大ブロック
FizzBuzzの規則性 • FizzBuzz大ブロックサンプル ◦ blkid 1900~1978 ⇔ 3000~3119 のFizzBuzz大ブロック ◦
blkid 1950 は6つ目の小ブロック6~13文字目(”uzzn3076”) FizzBuzz n3001n30 02nFizzn 3004nBuz znFizzn3 007n3008 nFizznBu zzn3011n Fizzn301 3n3014nF izzBuzzn 3016n301 7nFizzn3 019nBuzz nFizzn30 22n3023n FizznBuz zn3026nF izzn3028 n3029nFi zzBuzzn3 031n3032 nFizzn30 34nBuzzn Fizzn303 7n3038nF izznBuzz n3041nFi zzn3043n 3044nFiz zBuzzn30 46n3047n Fizzn304 9nBuzznF izzn3052 n3053nFi zznBuzzn 3056nFiz zn3058n3 059nFizz Buzzn306 1n3062nF izzn3064 nBuzznFi zzn3067n 3068nFiz znBuzzn3 071nFizz n3073n30 74nFizzB uzzn3076 n3077nFi zzn3079n BuzznFiz zn3082n3 083nFizz nBuzzn30 86nFizzn 3088n308 9nFizzBu zzn3091n 3092nFiz zn3094nB uzznFizz n3097n30 98nFizzn Buzzn310 1nFizzn3 103n3104 nFizzBuz zn3106n3 107nFizz n3109nBu zznFizzn 3112n311 3nFizznB uzzn3116 nFizzn31 18n3119n FizzBuzz n3121n31 22nFizzn 3124nBuz znFizzn3 127n3128 nFizznBu zzn3131n Fizzn313
FizzBuzzの規則性 • 計算式(4桁のn部分) ◦ パラメータは3種 ▪ 桁数=4 ▪ blkid補正=75 ▪
小ブロック番号補正=0 ◦ 導出パラメータは2種 ▪ 小ブロックサイズ=桁数+6=10 ▪ 大ブロックサイズ=(桁数+6)×8-1=79
FizzBuzzの規則性 • 計算式(4桁のn部分) ◦ 大ブロック位置計算 q,r = divmod(blkid + blkid補正,
大ブロックサイズ) ◦ 小ブロック位置計算 x,y = divmod(r, 小ブロックサイズ) ◦ 計算結果 通算小ブロック番号 = q×8 + x - 小ブロック番号補正 小ブロック内位置 = y×8 + x ◦ 計算例 blkid=1950 → q,r = divmod(1950+75, 79) = 25,50 x,y = divmod(50, 10) = 5,0 通算小ブロック番号 = 25×8 + 5 - 0 = 205 ( 205×15~205×15-1 小ブロック ) 小ブロック内位置 = 0×8 + 5 = 5 ( FizzBuzzn3076n3077nFizz…の6文字目から )
blkidからの8文字決定方法 • blkidから小ブロック通算番号と小ブロック内位置を決定 • 小ブロックをキャンバスに見立て、固定部分(Fizz等)を埋める • 数字部分をキャンバスに埋める • 小ブロック内位置を元にキャンバスから8文字抽出
実装詳細
実装にあたっての課題 • 桁数の違いへの対応 ◦ 数字部分の桁数、1~4とバリエーションがあるよね? → 桁数に応じて処理を分ける? コード量4倍なんて受け容れられるか!!(#^ω^) → パラメータの違いで吸収
& 数字は4桁で固定して考える ◦ 結局桁数の違いどうすんの? 文字位置を桁数に応じてスライドさせて対応 ※位置さえ分かれば、LM0のTレジスタ相対でなんとかなる
桁数に応じたスライド • スライドの方法 ◦ 小ブロック内位置を、4桁数字で考えたときの小ブロックの位置に換算 ◦ 位置の違いには規則性があることに着目 ◦ 換算用のオフセットを位置別にLM0に準備する ◦
以下は2桁の小ブロックでのズレの状況例 2×1ズレ 2×2ズレ 2×3ズレ 実際 換算
• キャンバスは4桁固定想定で用意する ◦ F,i,B,u,\nは固定で用意、次ブロックの先頭含め87単語分 4桁固定相当のキャンバス +1数字分 +2数字分 +4数字分 +7数字分 +8数字分
+11数字分 +13数字分 +14数字分
桁数に関する懸念事項 • ところで異なる桁数が混じると困らない? ◦ 桁数が変わるところは、9,10 や 99,100、999, 1000 の部分に相当 ◦
つまり、”FizznBuzzn” という固定長バリアとして機能 桁数が混じるブロックは考えなくて良い → FizzBuzz考案者はブロック化FizzBuzzを 考慮していたに違いない!!
その他実装上の課題 • 除算・剰余算の多用 ◦ 数値 → 数字換算も含め、divmod をたくさん使いますね? Mod 3
みたいなことしないといけないの?? ※ x % 3 = ( x + x / 3 ) & 3 = ( x + x × 119 × 2^(-9) ) & 3 的な話 → 除数によって処理変わっちゃうじゃん!!(#^ω^) ◦ 数値を浮動小数点数で扱えば乗算使える 逆数だけ自前で用意して、fvmul → ffloor → fvfma で divmod ※数字換算の場合は、fvadd ( +48.0 ) と fftoi も追加
パラメータの決定 • 1~4桁対応のためのパラメータ ◦ blkid→桁数換算のための閾値も必要 ◦ 導出パラメータは計算して作るが、逆数は自前で用意 桁数 開始blkid blkid補正
小ブロック 番号補正 小ブロックサイズ 逆数 大ブロックサイズ 逆数 1 0 8 1 1/7=0.14285… 1/55=0.01818… 2 3 49 6 1/8=0.125 1/63=0.01587… 3 50 35 3 1/9=0.11111… 1/71=0.01408… 4 583 75 0 1/10=0.1 1/79=0.01265…
擬似コード • 擬似コード ◦ 最初に一般の言語で擬似コードを組み、MN-Core用に移植する手法 を採った ◦ Ruby版はこちら https://ideone.com/YBHO1m ※普段は絶対やらない
P12=12 のような定数指定をちらほら使用
• 実装コード上の処理の流れ 処理の流れ const blkid select position canvas ftos4 slide
makeblk merge 定数準備 blkid計算 パラメタ選択 位置情報等計算 キャンバス準備 4桁の数字化×8 スライド用オフセット 準備 8文字抽出+1長語へ の縮約 L1BM→… →DRAMへマージ
• ステージ別の行数内訳(初提出時) ◦ ftos4やslideが結構重い 行数内訳(初提出時) ステージ 行数 const 22 blkid
10 select 5 ステージ 行数 position 14 canvas 19 ftos4 24 ステージ 行数 slide 23 makeblk 18 merge 8 合計 143
• チューニング内容 ◦ 処理のオーバーラップ ALUが遊んでいるところに定数生成やpassa処理を埋める L1BM処理をpassa処理の代わりとして埋める ※特にpassaだらけのcanvasが無駄! ◦ レジスタ・メモリ調整 コンフリクトを起こさないように、使うレジスタ・メモリを変更
チューニング
• ステージ別の行数内訳(最終版) ◦ ftos4やcanvasを重点的に削れた 行数内訳(最終版) ステージ 行数 const 20 blkid
9 select 5 ステージ 行数 position 14 canvas 2 ftos4 15 ステージ 行数 slide 23 makeblk 16 merge 8 合計 112
終わりに
• Count Upにヒントを得て、ブロック化FizzBuzzを実装 • ほとんどの処理を共通化し、パラメタの違いに吸収 • 可変桁数部分はなるべく固定桁で扱い、位置のずれだけなんとかする • 除算・剰余算も浮動小数点なら怖くない ※でも逆数の計算はかんべんな
• 最短は逃したけど、まあまあ頑張って実装できた…かも • 単純化のツケがslideにいったのが方針的には反省点 まとめ
• 出力位置から内容を決定する、普段とは逆のFizzBuzzが新鮮だった • 処理のオーバーラップで短縮するのが気持ちよかった • 扱ってる数字とメモリ上の位置の対応に混乱して大変だった • (特にFMAのとき)レジスタ本数が圧迫されて調整が大変だった • 浮動小数点数が好きになった(掛け算や割り算ができる!)
感想 このような面白い企画を開催していただき、有難うございます!