なるほどえたきちのブログじゃねーの

チラ裏雑記帳

ポケモン過去作の解析とか乱数調整とかそこら辺。不定期更新。

【Pokémon Past Generation Advent Calendar 2023】検索処理高速化メモと自動化関連のアレコレ

概要

この記事はPokémon Past Generation Advent Calendar 2023 20日目の記事です。
勢いで登録したのでネタはあんまりありません!
SVで乱数調整ができなくなってしまったので仕方ないね。
ツールの高速化メモだけでも良かったのですが、自動化関連のことに関しても一応書きました。

乱数調整ツールの高速化メモ(基本)

アルゴリズムを云々とかプログラムの書き方を云々とかやることは色々ある気がしますが、手っ取り早く速くできるのはここら辺です。

・並列化
SIMD
GPGPU

それぞれについて雑に纏めます。
1日目に夜綱さんが書いてたのとほぼ丸被りだけど許して。

並列化

コアが多ければ多い程速くなります。
精々4コア程度しかなかった昔ならいざ知らず、現代では10コアとか16コアとかのCPUが当たり前のように売られているので、これをするだけで劇的な高速化が見込めます。

並列化する際、スレッド数やコア数に合わせてスレッドを立てるのが一般的な気がしますが、結局最後の1つが計算完了するまでは処理が終わらないので大量にスレッド立てて1つ当たりの計算量を落とす方が速くなることが多いです。(環境によって違うかも?私の環境ではそうでした)

バグの温床になり易いですが、別スレッドで同じ領域のメモリを参照しないようにするということだけ意識しておけば大体避けられます。

あと、並列化していてもループの中で新規メモリ確保とかやってるとCPU使用率が伸びません。
普通のループ処理でもここがボトルネックになり易いので配列とかは先に宣言するようにしましょう。

SIMD

何か最近一部の乱数勢がこれで遊んでたような気がします。
私が2020年頃に作っていた5genSearch、6genSeedSearchでこれを使用しています。(6genSeedSearchの方はかなり適当なのでまだまだ詰められると思います、詰められました)

CPUの種類によって使えない命令、ほぼ意味のない命令があったりと中々クセがありますが、上手くいけば並列化と同等の高速化が見込めます。
並列化と同時に使えるので愚直に書いた時と比べて数十倍単位で計算時間が詰められる場合もあります。気持ち良い!

GPGPU

前述した2つはCPUで計算させる場合のテクニックですが、GPUに計算を丸投げするやり方もあります。
私のツールだとSW Seed Calculator(剣盾レイド乱数ツール)でこれを使用しています。
他の方が制作しているレイド乱数ツールでもこれが使われているものが多いですね。
こちらも中々クセがありますが、ちゃんと実装できればCPUだと数分掛かるような計算をほんの数秒で完了させたりもできます。
本当にちゃんと計算できてるのか不安になるレベルですね。気持ち良い!

ここではGPGPUと括っていますが、これにもCUDAとかOpenCLとか色々種類があるようです。
一般的なのは今挙げたCUDAとOpenCLで、対応しているGPUやそもそもの仕組みに結構違いがあります。
乱数調整ツールで使うくらいの用途なら取り敢えずCUDAだけ使えれば問題はないと思います。

乱数調整ツールの高速化メモ(応用)

先に挙げた3つ程の効果はないですが、多少手間が掛かってもいいからもっと速くしたい!という場合に使えるかもしれないやつです。
応用と言いつつしょーもない内容です。おまじないレベルのものもあります。え?と思ったら参考にしない方がいいです。

・ネイティブ言語で書く
・計算結果のキャッシュ
キャッシュメモリを意識した配列アクセス
・それでも満足できなければ全部アセンブリで書く

ネイティブ言語で書く

読んで字の如く、C#やらPythonやらは捨てましょう。
CPUが直接実行できないプログラムは全部雑魚です。
メインの計算処理だけネイティブライブラリにして .Netアプリケーションとかで叩くのが丸いです。

計算結果のキャッシュ

今までは「高速化」を目的としましたが、「そもそもの計算量を減らす」ことでも同じような結果が得られます。
無駄な計算処理はとことん省きましょう。
応用に入れてますが普通にこれも基本テクだと思います。
コンパイラが勝手にやってくれれば嬉しいですが、意外とアテにならないので自分でやりましょう。

キャッシュメモリを意識した配列アクセス

これも頭の片隅に入れておくと使える場面が来たときに気持ちよくなれます。
こちらもコンパイラが勝手にやってくれれば嬉しいですが、やっぱりアテにならないので自分でやった方がいいです。

それでも満足できなければ全部アセンブリで書く

ある程度慣れてくると、Cでコーディングしている最中にコンパイル後のアセンブリが頭の中に浮かんでくるようになります。
コンパイラが信用できなくなったあなたは我慢できずに直接アセンブリを書くようになるでしょう。

自動化関連のアレコレ

冷静に考えたら去年のアドベントカレンダーで書きたいこと大体書いてました。
blog.bzl-web.com

CH552マイコンボードの供給状況について

もうBoothで公開してから1年くらい経ってますが安定して供給できています。
部品の在庫切れの心配も今の所ないです。
あと専用のケースが綺麗に閉まるようになりました。パチッとはまるので気持ち良いです。
bzl.booth.pm

初期設定も今まで使っていたマイコン等と比べてかなり簡単な上、コストもかなり低いのでPC経由で操作するタイプの自動化に関してはこれ使っておけば色々楽だと思います。
PCから操作する場合であっても以下の動画の通りそこそこの精度が出せるので、殆どのプログラムが置き換え可能だと思います。
NXやポケコンのプログラムであればそのまま使用可能なので、互換性周りの心配も殆ど要りません。

RP2040、強い

最早自動化全く関係ないですが、RP2040を使用したコントローラー基板を作りました。
bzl.booth.pm
有志の検証によるとRP2040を使用したコントローラーの遅延は他の純正機器と比べてもかなり少ないようです。

自動化に使えば今まで以上の精度での操作ができる...かもしれませんが、多分環境差異の方が大きいです。
スペックに結構余裕があるので他のマイコンではちょっとギリギリだったプロコンエミュレートも難なくこなせます。
色々やってたらジャイロの制御とかもできるようになったので、そこら辺の自動化もいつかやってみたいですね。

あとがき

多分間に合ってないですが一応書き切ることができました。
21日目の記事は麻さんの『3世代ポケモンを快適に遊ぼう!ヒミツノバで購入したGBAレビュー』らしいです。
カスタムGBA関連も最近は色々変なパーツが出ているので久しぶりに何か作ろうかな...