姉妹編:セキュリティ・キャンプ 2026 全国大会・応募課題晒し (L2, CPU)

8/10 から 8/15 にかけてセキュリティ・キャンプ 2026 全国大会/ネクスト/ジュニアが同時開催されており,そのうちの全国大会の開発コースの L2 ゼミ CPU 班に参加していたのでそのことについて書く.

セキュリティ・キャンプとは

公式サイトを見ていてもよくわからないのだが,まずセキュリティ・キャンプには全国大会,ネクスト,ジュニア,コネクト,ミニといった variant が存在する.そのうち,毎年夏に行われる最も大きなイベントが全国大会,ネクスト,ジュニアの合同開催である.このイベントそのものが全国大会と呼ばれているわけではないことに注意されたい.全国大会を基準として,ジュニアはそれよりも若い参加者(小中学生)を,ネクストは全国大会卒業レベルを想定したイベントである.また全国大会は開発コース・専門コースに二分されており,開発コースはずっと自分の課題に取り組む一方で,専門コース,ネクスト,ジュニアは半日毎に別のテーマを扱う講義形式で開催されている.

受講生の規模感としてはジュニア,ネクストは 10 人程度であるのに対し,全国大会は 100 人程度である.その規模からして自然なことだが,全国大会は内部にいくつものゼミを内包しており,各ゼミは数人の受講生,講師,チューターからなる.

私が今回参加したのは全国大会の開発コースの L2 ゼミの CPU 班である.班という概念はゼミ一般には存在しないのだが,大人の事情1により今年の L2 ゼミは CPU 班と NPU 班からなっており,私はそのうちの CPU 班を希望したという次第だ.

応募の経緯

自分の所属している学科では 3 年生の後期に CPU 実験と呼ばれる実験があり,各班にはコア係,コンパイラ係,FPU・メモリ係,シミュレーション係がおり,協力してレイトレーシングを高速に動作させることを目指す.私はここでコンパイラ係をやりたいのだが,一方でコアも書いてみたい.そもそもコンパイラを書くにしたって CPU を深く理解しておくことは重要なことだし,自前の ISA を設計するのならなおさらである.そういった経緯で(CPU を書きたい気分だなあ)と思っていたところでセキュリティ・キャンプの存在を思い出したのだった.

応募課題をチラ見して(重いな…… ちょっと寝かそうかな……)などとクネクネしている期間が一ヶ月くらいあり,締切一週間くらい前から手を付け始めた気がする.五月祭の直前に図書館に籠って課題を書いた.ヘネパタとか Tanenbaum とかを見ながらガーッと書いたのだが,最終的にはちょっと飽きてしまい投げやり感のある出来上がりになった.

学科の同期である @ret2home は一週間くらい大学に来ずに爆発的な長さを錬成して応募しており,それでいて「いや~全然落ちうるんだよな~」とか言っており,ヒエーッと思いながら過ごしていた.6 月初旬に参加者発表とされており,6 月になってから毎朝ドキドキしながら IPA のサイトを見てガッカリするなどしていた.その後発表が延期されるなどして毎朝のルーティンから IPA チェックが外れたくらいでやっと参加者が発表され,通過しておりホッとした(当然 @ret2home も通過していた).

事前学習

CPU 班の他の受講生は @Ryoga_exe さん, @Latte72R さんであり,講師は @kanataso さんだった(当日からはチューターの @Cra2yPierr0t さんも加わった).毎週金曜日の 21 時に Discord に集まり,講義を受講した後に各受講生の進捗を共有するというスタイルで事前学習は進行した.講義のクオリティは非常に高く,学科のコンピュータアーキテクチャの授業でよくわかっていなかった痒い所に手が届くようだった.コンピュータアーキテクチャの授業では「○○をここで実装し,こういうときは flush すればよいです」みたいなことをよく言われるが,実際にこれをどう実装すればよいのかは見当もついていないのだった.分岐予測や OoO はおろか,パイプラインハザードでさえその実装は自明でないと思う.

他の受講生は Veryl という HDL で CPU を書いていたのだが,自分は Clash で書いていた.これについては他の記事にするかもしれないししないかもしれないのだが,Clash は Haskell をフロントエンドとした HDL であり,機能的には Haskell を HDL として使うことができる.clash-prelude はハードウェア記述のための primitive 及び utility を Haskell package として提供していて,GHC をフロントエンドとして利用する clash-compiler 及び clash-lib は SystemVerilog, Verilog, VHDL をターゲットとするトランスパイラである.

以下が自分の書いた CPU のリポジトリである.Cuintet という名前はフンワリ付いていて,Clash, RISC, CPU などなんとなく C が象徴的に思われて,さらに 5 段パイプライン,RISC-V で 5 のイメージもあったために quintet から取った.

GitHub Repository Card

講義と並行して,Verylで作るCPU に沿って自分の CPU を書き進めていた.この資料は講師によるものだが,前提知識も少なくコードが丁寧に解説されているので非常に読みやすい.基本的には Veryl で書かれたコードを Clash に翻訳していく作業なのだが,ちょうど手続き型言語のソースを関数型言語に直訳できない,したとしても idiomatic にならないというようなことが Veryl → Clash でも発生しており,Veryl でやっていることを理解してから Clash でリライトするというような形で時間がかかってしまっていた.特に最初はどう翻訳すればよいかわからず,Claude Code に Clash 製の他の CPU を読ませながら試行錯誤が続いた(unstable な値を Maybe で扱おうとすると型パズルが爆発してしまうというような問題があったり,ノンブロッキング代入をどう扱うかだったりで様々なテクニックがある.これも今度記事にするかもしれない).

テストも重なり二週間程進捗が生まれなかったりもしたのだが,直前でガガーッと進め 5 段パイプラインの RV64I_Zicsr を実装,riscv-tests の rv64ui-p が通り安心したところでいざ当日.

当日

Day 1

前日まで札幌に帰省していたので大急ぎで洗濯し,当日の朝にパッキングして多摩センターに出発.@ret2home と一緒にご飯を食べようと思って連絡すると,彼の知り合い2もいたので 3 人で軽く食べた.このときまで 4 泊 5 日なのか 5 泊 6 日なのかよくわかっておらず(確認をするとよいです),服が 1 セット足りていないことが判明.T シャツが配布されたので事無きを得た(なお他は……).ゆっくり食べていたら時間が無くて,@ret2home と LINK FOREST まで猛ダッシュで向かう.13:15 まで受付のところを 13:16 到着という疑惑の判定で通過.LINK FOREST にはなんとクロークも存在しており,なんだかお金のある春合宿のようだと言っていた.

おそらくランダムに配置された 4 人席に着き,若い人が多くてすごいなどと言っているうちに開講式が始まる.セキュリティ・キャンプは経済産業省などによって後援されており,その関係かはわからないが伝統的なタイプの式だった.大学生にもなるとエラい人の話を連続して聞くというような体験の機会がめっきり減り新鮮な気持ち.その後で 2 つほど共通講義を受けたのだが,なにかと SNS での公開禁止の話が多かった気がするので言及はやめておく.

セキュリティ・キャンプでは伝統的に名刺交換によるコミュニケーションが通例であり,オリエンテーションでも名刺交換タイムが存在した.自分も名刺を作らないといけないなあと思って作りかけていたのだが,前日まで帰省していた関係で気付いたころには既に手遅れであり,名刺無しでの参戦となった.そこで前日の晩に https://noshi91.hatenablog.com/entry/2022/12/29/024840 を思い出し,簡易的に首からかける自己紹介スライドを錬成した.これは意外にも(特に大人に)好評であり,名刺は無いものの首からこれをかけているということで認知されるというパターンにも遭遇した.

自己紹介スライド

@ret2home と LT のネタを考えてから解散.一人部屋な時点でありがたいのだが,想定の 2 倍くらいの広さの部屋で納税者の皆様に足を向けて寝られなくなってしまった.サークルの合宿とかではバスタオルも持参の 5 人部屋が多いので,清掃が入りタオルも交換されることが新鮮.ありがとう……

Day 2

セキュリティ・キャンプのメインは Day 2-4 と言ってよく,開発コースでは日がな開発,それ以外では半日単位で専門講義が行われていた.

この時点で自分の CPU は RV64I_Zicsr が実装されており,5 段パイプラインになっていた.ここからの目標を 実機への合成,M 拡張の実装,例外の実装,Konata 対応,OoO と堂々宣言して実装開始.

この日は LED 用の CSR を追加し top に露出させたり,レジスタがうまい具合に推論されるようにして LUT 数を Tang Nano 9K に収めたりすることで,実機で L チカに成功した(ここでいう L チカというのは,naive な L チカではなくて LED 制御をプログラムで行えるようになったということ).

昼食・夕食は好きなタイミングで行けるのだが,ここではいろいろな話を聞けてよかった.定理証明支援系によってシステムプログラミングを支援する処理系を作っている人の話とかを聞いた.あとは L ゼミのプロデューサー・講師・チューター陣に D 進を薦められたりした.

夕食後には毎日異なるイベントが用意されており,この日は LT 大会が開催され, @ret2home と二人で学科のシステムプログラミング実験のポジティブキャンペーンをした.一番下品な煽りをつけてやろうと【内部告発】をタイトルに冠したのだが,内部告発って大丈夫なのかと心配されたりしたのであまりよくなかった.自己紹介パートで「モナドがさあ!」と叫ぶオタクの真似をしたのだが(これは学科では割とウケていた),スベっており恥ずかしい…… Wii には PowerPC が搭載されており endian の違いで悪いことができる話,ドイツの電話の root を取る話など,オモシロパソコントークが聞けて満足.寝る前に Konata に対応した.

Day 3

この日に M 拡張を実装し,CoreMark というベンチマークが走るようになった.CPU 班では 3 人の受講生の CPU を最大動作周波数と実行 cycle 数の積でバトルさせていたのだが,やっと自分の CPU が CoreMark 部門にエントリした.講師が Web アプリを並行して作成しディスプレイに表示させていたのだが,結果としてこれは非常によい試みだった.自分で CPU を書いているとテストや Konata を見たりはするのだが,いちいち最大動作周波数を計測するのは面倒でサボりがちだ.しかし,分岐予測などの最適化を入れ命令数を減らし満足していたらクリティカルパスが倍に伸びておりおしまいということは往々にしてある.CPU を書く以上クリティカルパスを意識するのは非常に重要なことであり,わかりやすくそれを体感するためにこの Web アプリは役立った.

この時点で残る目標は例外,OoO となっていたのだが,開発が遅れている自分の CPU はずっと最下位を記録しており,これを挽回したいという気持ちが高まってきてしまった.他の二人と割と違うロジックでここまで来たという部分もありマトモな最適化を入れたら挽回できるのではないかという下心もあり,乗算器・分岐予測に進むことを決めた.

この日の夜は共通講義があった.アントレプレナーシップの講義だったのだが,自分はあまり起業に興味が無かったために Booth のアルゴリズムの勉強をしてしまった.すみません……

Day 4

この日はまず Booth のアルゴリズムを実装した.Booth のアルゴリズムは高速な乗算器のためのアルゴリズムであり,これを実装することでひとまず乗算が 65 cycles から 33 cycles に落ちた.CoreMark は乗算を多く含むため,これだけでかなりの実行サイクル数の削減になる(一方で除算は 1 回しか現れないため,受講生はみな除算器の最適化に目もくれていない).その後,Booth のアルゴリズムの早期打ち切り(multiplier の上位ビットが 0...01...1 になった時点で,その後の計算はしなくてよい)を入れることでなんと実行サイクル数でトップに躍り出る.これも CoreMark 特有の事情だが,小さな数の乗算が多いとより早期に打ち切れるためにこれが効いた.

実行サイクル数でトップである一方,最大動作周波数との積のランキングでは依然として最下位に留まってしまっていた.これはまさしくクリティカルパスの問題で,早期打ち切りを加えた時点でクリティカルパスが倍増してしまい,結果として最大動作周波数が半分になってしまっていたのだった.negate 一回でも 64 bit の直列な依存ができてしまうのだが,こういう感覚に敏感になれていなかった.

その後で静的分岐予測 (backward taken, forward not taken) から BTB (Branch Target Buffer) を実装するなどしてジワジワと命令数は減っていったものの,手元にクリティカルパスの測定環境を用意できておらず (Tang Nano 9K は合成できていたのだが,もはや LUT の数が収まっていなかった),最大動作周波数は改善されないまま終わってしまった.最終 1 位の @Ryoga_exe さんには最後に講師が買ってきたアヒル(?)が贈呈されていた.

この日の夜は CTF 大会.CTF をやったことはないと思っていたのだが,やった覚えはあったのでやったことがあったらしい.あまり解けず……

Day 5

この日は午前中に成果発表会があり,午後は企業紹介セッションだった.成果発表といえども全員が発表するわけではなくゼミ毎に 10 分の時間が用意されており,L ゼミからは @Ryoga_exe さんが発表した.発表では 2 台の FPGA を CPU, GPU として利用し,ラップトップから UART でスライド画像を送信し MMIO で出力というスタイルで発表しており,これはかなりウケた.他のどのゼミも優秀な成果が出ており,いいね.

UART 送信によりプレゼンテーションをしている様子

また,いつのまにか @Latte72R さんの CPU 上で OS が動いていてスゴい.

午後は企業紹介セッションということで,就活フェスティバルみたいな感じになっていた.いくつか印象に残った企業はあったが,セキュリティエンジニア向けの紹介が多めであり(当たり前です),セキュリティエンジニアにはあまり興味がなくてすまん……

関係があるようでない話:キャンプでは確かにセキュリティの話をしているゼミもたくさんあるのだが,一方で自作 OS や CPU といったテーマは直接セキュリティに関係するわけではない.そういう意味でセキュリティ・キャンプは実質的には「低レイヤ・キャンプ」として機能しているのだが,そうした事実はセキュリティ・キャンプに興味を持たないと知りえない.低レイヤはやりたいがセキュリティにはあまり興味がないという潜在的な受講生が,セキュリティ・キャンプという名前によって取り逃がされている可能性はあるなあと思った.

その後は立食パーティであり,MN-Core がいかに攻めたアーキテクチャをしているかだとか,競技プログラミング老人会だとか,現代のセキュリティ・キャンプは筑波大学全盛の時代だとかそういう話をした.

Day 6

朝 8:30 に解散(何?).正直なところ Day 5 の夜に解散にしてほしい.どうせ前泊が存在するのだから Day 5 の夜は後泊扱いにしてくれてもよいのではないか.秋葉原にお買い物に向かう人々もいたが,自分は目当ての FPGA が売っていなそうなので大人しく帰った(KV260 をオススメしてもらった).家に着くとどっと疲れ,睡眠負債が溜まっていることを自覚した.部屋に帰ってから睡眠を削って開発していたのがよくなかった.

まとめ

まず,CPU を自作するのに最高の環境だったと思う.講師・チューターはなんでも答えてくれるし,一緒に CPU を書いて対抗できる仲間がいた.他人と同じ方向を向いて,期限を切って集中的に取り組むことは良いことだと思った.

様々な学びもあった.特に印象的だったのは,技術をおもしろがるという参加者の姿勢だった.電話を大量購入して破壊し root を取得する,なんにでも Linux を入れる,パケットにコーヒーリクエストを忍ばせて NOC に注文するなどの取り組みは新鮮であり,参加者にはみなそれをおもしろがって尊重しあう文化があった.自分もコンピュータサイエンスは好きだし勉強もするのだが,こうして実際に手を動かして成果をわかりやすい形にし,他人と共有しあうという姿勢は無かったなと思った.shift/reset 付きの OCaml インタプリタを作りましたと言ってリポジトリのリンクを貼るのではなく,インタプリタが動作している様子の動画を貼っておくだけでも他人からの興味を集めやすいし,繋がりも生まれる.インプット偏重だということも含めて自分の姿勢は良くも悪くもアカデミア的なところがあったなと思った.

おまけ:順に,Bimodal 四兄弟,メンダコ,自分のことを Spectre だと思っているメンダコ,自分のことをメンダコだと思っている Spectre

Bimodal の図の各ノードに顔が書かれている メンダコのぬいぐるみ Spectre のロゴのおばけがメンダコになっているイラスト Spectre のイラストに MENDAKO と書かれている

Footnotes

  1. 予算を取る上で名目上のゼミ数が増えてしまうと不都合らしい.陰に動いてくれている大人には本当に頭が上がりません.

  2. 参考文献.自分と「知り合い」はどちらも遠慮していたのだが……