2026 年 5 月 9 に開催した「第 7 回 自作 CPU を語る会」というイベントの開催報告です。今回は自作 CPU に限定したオセロ大会を目玉企画として開きましたので、後半はそちらを詳しく紹介します。筆者はこのイベントの主催をしています。
自作 CPU を語る会は自作 CPU をじっくり語るためのイベントです。前半に発表枠がいくつかあり、後半は展示会形式で自作 CPU を見学するという構成でやることが多いです。毎回 connpass で募集しているので、興味あればどうぞ。 第7回 自作CPUを語る会 自作CPUオセロ大会 - connpass
今回もその形式ですが、発表者の 1 人が体調不良でキャンセルなさったため、突発で自己紹介タイムとしました。自作 CPU の紹介とか、自作 CPU を語る会への参加動機などを話してもらいました。
自己紹介タイムはいつかやりたいと思いながら、実際にやろうとすると時間が結構かかるので、なかなか実施の目処が立っていなかった企画でした。発表枠が空いたので実験的にやってみましたが、結構盛り上がったのではないでしょうか。
今回の目玉企画として、自作 CPU 限定のオセロ大会を開催しました。2 台の自作 CPU 上で「コンピュータ対戦モードを備えたオセロプログラム」を動かし、コンピュータが出力した手を相手の自作 CPU に入力することで、オセロ AI 同士を戦わせます。公開情報を調べた限りコンピュータ対戦のオセロ大会は珍しくありませんが、自作 CPU に限定したイベントは前例が見当たりませんでした。もしかすると、世界初の珍しい企画かもしれません。
トーナメント表は下図の通りです。初戦の組み合わせは CPU のクロック周波数が近くなるようにしています。クロック周波数を基準にしているのは、クロック数が上がるほど 1 手の演算量を増やせ、有利になりやすいレギュレーションにしているからです。
今大会では 1 手あたりの思考時間の上限を、クロック周波数を $F$ として $\max(60 - 8*\log10(F), 0.1)$ 秒に制限しています。具体的には、0.1Hz→68秒、1Hz→60秒、1KHz→36秒、1MHz→12秒、10MHz→4秒などとなります。クロック周波数が 10 倍になる毎に制限時間が 8 秒縮まります。
例えば TD4EX4-2026 が 1KHz なので 1 手 36 秒、Z80 が 10MHz なので 1 手 4 秒です。制限時間が 1/9 になり、周波数が 1 万倍になっていますから、1 手あたりのクロック数は $10000/9 \approx 1111$ 倍になります。仮に 1 クロックあたりに実行できる命令数が同じならば、Z80 が 1 手あたりに実行できる命令数は TD4EX4-2026 の 1111 倍となります。めちゃくちゃ有利です。
基本的な要件として、イベント中に試合が終わる必要があります。欲を言えば何試合かやりたいです。そこで、1 試合あたり長くても 1 時間で終わる制限時間を考えました。オセロは 60 手で終局しますから、1 手あたり 1 分以下ということになります。1Hz のときに 60 秒というのは、ここから来ているのです。
流石にすべてのマシンで制限時間が同じでは、まったく試合にならないでしょう。そこで、クロック周波数が低いほど制限時間を延ばすことにしました。
しかし、クロックに比例した制限時間は、自作 CPU のクロックのばらつきを考えると現実的ではないと思いました。例えば電磁リレーを用いた CPU の場合、演算が機械的なスイッチで行われるために、非常にクロックが遅くなります。あるいは、今回のイベントで展示された Minecraft のレッドストーン回路で作られた CPU の場合、1 Hz に満たない速度しか出ないのだそうです。一方で、FPGA を用いた CPU であれば 10MHz 以上が簡単に出せます。性能の高い FPGA を用いれば数 100 MHz くらいは出せるかもしれません。上限を 100MHz としても、0.1Hz~100MHz という、実に広い範囲の周波数を考えねばなりません。
仮に 1Hz のとき 1 手 60 秒として、クロック周波数に比例した制限時間とすると、100MHz では 1 手 600ns 以下となります。時間を正しく測ることさえ難しいような短い時間です。
クロック周波数が高いほど有利になる数式としたのは別の理由もあります。それは、「頑張ってクロック周波数を上げるよう、設計・実装を頑張ってね」と、CPU の制作者を励ますためです。クロック周波数を上げるにはクリティカルパスを短くしたりクロックの配線を最適化したりと、設計・実装を頑張る必要があります。自作 CPU のためのイベントとして、参加者のモチベーションを上げる工夫をしようと思ったのです。
初戦はきっちー氏製作の平衡三進 CPU「Libra the Processor」と Exit 氏製作の TD4 をベースに改良を加えた「TD4EX4-2026」です。
右の緑色の基板が連なったマシンが Libra the Processor、左の黒い筐体が TD4EX4-2026 です。TD4EX4-2026 はバッテリで動作するようになっており、試合の相手がいる机にぱっと運んで動作できていました。ポータブル CPU!
上の写真は当オセロ大会の記念すべき初戦を見学する人々です。皆さん興味津々に試合の様子を見守っていました。とある見学者は CPU が頑張って次の手を演算する様子を見て、すごく牧歌的だなというような感想を言っていました。本当にその通りだと思います。今打った手が良い手かどうか、見学者がゆっくり考える時間があり、まるで人間同士の試合を見ているようでした。
初戦の勝者は TD4EX4-2026 でした。Libra the Processor はその演算性能が非常に限られているため、盤面の左上から探索し、最初に見つけた合法手を返すだけなので、大方の予想通りの結果になった形です。
なお、Libra the Processor はイベント当時はまだ実機ではオセロ AI が動かず、エミュレータでの参戦となりました。
きっちー氏(Libra the Processor)が先手です。
D3C3B3B2B1E3D2C5F3G3H3A1B4D1C1A3E1F1A5F4F5H2H1F2C2G6D6E7E2E6
C4G4G5G2A2G1A4A6B5B6H4H5C6C7F6F7H6A7B7D7D8G7G8H7F8E8C8A8B8H8
Libra the Processor と TD4EX4-2026 の試合が行われている裏で Tanuki Bayashin さんの Z80 で動作するオセロ AI と筆者の BuntanPC で試合を行いました。下の写真は Tanuki Bayashin さんの作品です。カラーディスプレイにオセロの絵が表示されていて、とても見やすいです。
ジャンケンで手番を決め、黒が Z80、白が BuntanPC となりました。序盤は白がたくさん取っていたのですが、黒に角を 2 つ取られてからどんどん黒に追い上げられてきました。筆者の BuntanPC は 27MHz なので、10MHz の Z80 より 2.7 倍もクロックが速く演算量は有利なはずですが、Tanuki Bayashin さんのオセロ AI は終盤戦で合法手が少なくなってきたときに先読みを深くするという工夫のためか、なかなか強かったです。
この調子で終局まで打つと BuntanPC が負けそうな気がしました。しかし、後 3 手というところで Tanuki Bayashin さんのオセロ AI が全然次の手を返さなくなってしまいました。本来の制限時間は 4 秒ですが、30 秒くらい待っても反応がなかったため、レギュレーション違反負けということにしました。一応、BuntanPC の勝利です。本当はすっきり勝ちたかったですけど。
ちなみに、BuntanPC は棋譜をファイルに保存する機能を持ちます。その機能で保存した棋譜ファイルは次の通りです。
TANUC1.KIF
player_black: tanuc
player_white: AI
kifu: d3c3c4e3d2c5b4d1e1c1c6f1e2b5d6c7e7a5c2f8f2b3a6g2f3g3d7a7a4a3e6e8d8f7f6g6f5c8g5g4f4g7h2h3h4h5h6h7h8g8b8b7b2b1a8g1
ファイル名は <player><prefix>.KIF となっています。player はプレイヤー名で、今回は Tanuki Bayashin さんと私が対戦したので Tan + Uc = tanuc としました。prefix は同じプレイヤーとの対戦でファイル名が被らないようにするための数字で、今回は tanuc としては 1 回目の棋譜保存だったので 1 にしました。
白番(player_white)が AI ということになっています。よって、BuntanPC が白番、Z80 が黒番であることが分かります。
準決勝は初戦の勝者 TD4EX4-2026 と第 2 試合の勝者 BuntanPC の戦いです。TD4EX4-2026 はバッテリ駆動のポータブルマシンなので、BuntanPC の横に持ってきてもらい、並んで試合を行いました。
TD4EX4-2026 は発見した手の座標を 7 セグメント LED に表示するという仕組みです。手の探索中に発見した暫定候補を LED に表示しておいてくれる機能が嬉しかったです。暫定手が最終的な答えになることも多かったため、BuntanPC 側で投機的にカーソルを動かしておき、手が確定したときにすぐ入力することができました。
それから、TD4EX4-2026 が 8×8 のドットマトリクス LED に盤面を表示するのも良いアイデアだと思いました。まず見た目が綺麗ですよね。緑が先手(黒石)、赤が後手(白石)だそうです。下図は終局時のもので、先手番の BuntanPC が右側 2/3 ほどの面積を取っていることが分かります。45 対 19 で勝ちました。
こちらは終局時の BuntanPC 側の表示です。こちらでも black=45 white=19 と、正しく結果を表示できています。終局判定は大会の直前に実装が間に合った機能です。間に合って良かった!
EXITUC1.KIF
player_black: AI
player_white: exituc
kifu: d3c3b3b2b1e3f3a1c4g3h3e2f5a3e1d6c2d2a2c1d7g6f4f2g2b4h7h2f1g1h1e6e7g5h4c8f6g4a4a5f7g7f8g8h8h6h5c6c5c7b6b5e8a6d1d8b8b7a7a8
ちぇりーたくあんさんは特別シード枠で、決勝戦からの参戦です。
実はこのイベントの前、4/18 にプレ試合を行いました。そのときの参加者は Tanuki Bayashin さん、私、そしてちぇりーたくあんさんでした。そして、ちぇりーたくあんさんはプレ試合の優勝者です。というのが特別シードになったいきさつです。
決勝まで暇を持て余したちぇりーたくあんさんは、決勝戦の前に何試合かしていたようです。私は Tanuki Bayashin さんと対戦していたので、見られませんでしたが。
NLP-16A vs Libra the Processor の棋譜を示します。
D3C3C4E3F3G3F6B5D2C1A6C5H3E2F1F2D1E1B1B4A5B2A1C2F4A2D6A4G2H2
H1G4F5G1B3A3H4H5G5H6B6C6E6E7G6F7A7A8B7D7C7C8G7H8B8D8H7E8F8G8
さて、決勝で NLP-16A と BuntanPC が戦う様子を動画に記録しましたので、是非ご覧ください。第7回 自作CPUを語る会 自作CPUオセロ大会 NLP-16A vs BuntanPC NLP-16A 上で動くオセロプログラムが出力した手(C4)を BuntanPC に入力し、次の手(E3)が出力される様子が記録されています。
試合の結果は、なんと NLP-16A の勝利!NLP-16A は 300KHz のマシンですから、27MHz のクロックを持つ BuntanPC の方が圧倒的に有利なはずなのに。1 手あたりの制限時間は、NLP-16A が約 16 秒、BuntanPC が約 0.55 秒です。したがって、1 手あたりのクロック数は BuntanPC の方が 3.1 倍程度多い計算になります。仮に 1 クロックあたりの演算性能が同じだとすれば、BuntanPC の方が 3.1 倍の演算を行えるわけです。
※上の文を書いているときに気付いてしまいました。今回利用した制限時間の数式では、11.6MHz 付近をピークに、それより周波数が高いと 1 手あたりクロック数が減ることに!実は、Tanuki Bayashin さんの Z80 より、BuntanPC の方が 1 手あたりクロック数が少なく、不利だったことが判明しました。NLP-16A よりは流石に BuntanPC の方が有利なのですが、しかし、当初思っていたような圧倒的な有利ではなく、たった 3.1 倍だったというのが分かりました。ああ、だから AI のアルゴリズムや評価関数の品質が勝敗に影響を与えたんだな、と、納得しました。
CHRY1.KIF
player_black: chry
player_white: AI
kifu: d3c3c4e3f3c5b4g2f6g7f4f5h8a4e2d1h1e6c6f2f1g4d2d6e7h2a3e8h4b6f8a2c1b1a6c7d7f7c8a5a1d8e1h3b5c2g5h6h5b8a8b3h7g3g6g8b2b7g1a7
今回のイベントでは名札を準備してみました。参加者の名前や所属が分かる方が「ああ、あの人!」っていうのが気付きやすいですからね。
名札の中紙は今回のために特注しました。OSC(オープンソースカンファレンス)の名札デザインを大いに参考にさせていただきました。
面白いと思う話題をいくつかピックアップしてご紹介します。
@lxacas さんによる発表「フラッシュメモリ製のオセロコンピュータ」で、面白いスライドがありました。この方式で CPU を自作することを、不正のトライアングルで説明していたのです(笑)
https://x.com/i/status/2053437554188575121
今ではなかなか見ることができない、往年のロジック IC を持ってきて展示している方がいらっしゃいました。
https://x.com/i/status/2053071628322701408
BuntanPC 用に作ったシリアルコンソールですが、秋田先生に「これ単体で欲しい」と評価していただけました。実はこれまでにも欲しいという方はいたので、もう少し完成度が上がったら他の方に使ってもらえるような方法を考えようと思います。
https://x.com/i/status/2053103549937295688
この装置について少しだけ詳細を書いておきます。自作 CPU と UART(今のところ Grove コネクタを採用)にて接続します。CPU から ASCII コードを送りつけると、それを HDMI ディスプレイに描画します。VT100 のエスケープシーケンスの一部に対応していて、カーソル移動とか行消去コマンドなどが使えます。
次の機能拡張としては、USB キーボードを接続できるようにしたいと考えています。そうなれば、CPU に対して USB キーボードから入力できるようになります。自作 CPU に UART 回路さえ積めば、HDMI ディスプレイへの出力と、USB キーボードからの入力ができるというわけです。
さも便利そうに書きましたが、そんなことはパソコンに Tera Term でもインストールして、USB シリアル変換器を繋げば実現できるんです。「BuntanPC シリアルコンソール」の最大のウリは、それ自体には CPU が積まれていない、ということです。低性能な自作 CPU と高性能なパソコンを繋ぐのはバランスが悪いと思うことはないでしょうか。もしかしたら、見学者から「パソコン側で処理して、その表示を自作 CPU でやってるだけなんじゃないの?」と思われるかもしれません。BuntanPC シリアルコンソールを使えばパソコンは登場せず、主役はあくまでも自作 CPU のままです。