The software side of AI Chess provides tooling for the exploration and research of chess positions. Note that the current focus is indeed around Positions, but it spills into Moves in certain areas. For example, statistics around Promotions, etc. can only exist within the context of a Move, while “King in check” can be determined by position.
The game of chess is a fascinating information space to work in. The game space is extremely large. Some have even said that chess will never be solved, or that storing all possible positions will never be possible. I have a personal issue with the term never, especially when coupled with exponential growth and improvements in encoding, but that is a matter for another article. For now, it is merely enough to know that the frontier of ability to store and analyze chess positions moves forward. This then, is the real goal: To provide tooling that expands the capability to work with exceedingly large volumes of chess data and continue the expansion of knowledge in academic and statistical fields (position counts, etc.).
This toolset is organized around three related problems: exact tree counting, large corpus handling, and GPU-native engine work. This work aligns well with my interests and background in high-performance distributed computing, data compression, scalable IT systems, and hyper-optimization of code.
perft(), a routine for generating the tree of all legal moves N ply deep from a given starting position and counting the leaf nodes/positions, is central because it is a foundation for exploration of game trees. It is also useful to attest to the correctness of move generation(movegen) routines. It is the epitome of high speed recursion and a fun optimization target to boot. With this and its sibling upc() which stands for Unique Position Count and counts the distinct nodes/positions at a given ply as a basis, many other things follow.
Alpha status: Work in progress. Every executable, file format, and pipeline described in this section should be treated as alpha software. Expect interfaces and behavior to change, and run everything at your own risk. The executables are NOT tuned or certified for anything but my research lab. Theoretically, they should run on an identical or similar enough machine that supports the correct shader models. Or in FENMaster’s case, should work on anything. That doesn’t mean it DOES though. This site is literally giving access to internal experimental builds until they reach a release state when I will put them in proper repos.
The Base Projects
GPUPerftis a GPU-based perft() engine with additional capabilities for upc(), stats collection, and even exportingFENMasteris a tool for converting masses of positions from and to target formats, with the ability to filter in-processPerftStormis a GPU-native chess engine for exploring complete-coverage move selection (It never misses a mate-in-X!)
Headline Results
| Area | Headline |
|---|---|
GPUPerft CDP1 |
RTX 3090-era reference reached 6T NPS on perft(12). In practical terms, that was the first 6-trillion-nodes-per-second class checkpoint for the project, and as far as I’m aware, for a single GPU, the fastest perft() on Earth…at the time. |
GPUPerft CDP2 |
The current pure-perft fork on RTX 5090 validated start-position perft(11) = 2,097,651,003,696,806 in 226.716s, 9.25T NPS and represents the fastest known single-GPU perft() at the time of this writing. |
FENMaster |
Massively parallel tunable conversion and filtering pipeline for position corpuses that cannot fit in memory. Processes 100M+ positions/sec. limited by CPU and Disk(sustained 2+GB/s) Entirely CPU-based…for now. |
CCCF |
A new chess position archive format for canonical storage of chess tree data with very high compression ratios and very high throughput while retaining random lookup capability. A validated fen -> cccf matrix run stored 16,508,408 unique canonical output records, while maintaining multiplicity information per position, at 5.783 bits per input FEN. |
Software Map
| Project | Role | Current emphasis |
|---|---|---|
| GPUPerft | GPU perft, move-generation experiments, and frontier export. | CDP1 as the historical 6T-class baseline, CDP2 as the current 5090-class CUDA lane, OpenCL as the portable lane, and multiplicity-preserving export for downstream corpus work. |
| FENMaster | Corpus conversion, filtering, verification, canonicalization, and replay. | Structural and numeric filtering, deterministic sharding, frontier and CCCF handling, and high-throughput CPU execution. |
| PerftStorm | GPU-native engine and move-generation lab. | Board representations, legal move generation, continuation waves, and engine architecture that fits the hardware rather than inherited recursion. |
Why The Export Story Matters
Raw node counts are not enough. If the project is going to support deeper statistics work, reproducible research, or distributed analysis, it also needs a way to store the tree output economically without discarding multiplicity.
That is where the export and corpus work meet:
GPUPerftemits multiplicity-preserving frontier data instead of forcing a later tool to reconstruct totals from scratch.FENMasterprovides canonicalcccfhandling, deduplication, verification, and replay on top of those corpora.- The combination allows the full logical perft corpus to be stored as one canonical record per unique position plus the count information needed to preserve the complete node totals.
That is the difference between a fast benchmark and a reusable data product.
What research does this support?
These tools help answer some questions:
- How many unique positions can legally be reached on ply N?
- What is the true/unique branching ratio of chess (as opposed to the node count branching factor) – hint: data shows that not only is it much lower, it DECREASES as ply increases!
- How many promotions, checkmates, castles, etc. occur at each ply?
- What information context allows the smallest physical storage of position data? (i.e. What’s the entropy?)
The longer experimental history still belongs in the research archive. The software section is the stable front door.