This article documents the validation corpus built into the GPUPerft CDP2 --verify command. The set combines well-known Chess Programming Wiki perft positions, targeted mate-net positions, compact endgames, and deterministic random-walk game positions. Together these positions exercise castling, en passant, promotions, checks, pins, sparse endgames, and deeper game-state combinations.
The values below are reference node counts for the listed depth. Each listed value was validated with Stockfish 18 before being incorporated into the --verify corpus. The standard corpus records depth 8 and depth 9 for every position. The starting position is also carried to depth 10 and depth 11 because it is the primary long-run validation and throughput reference.
.verify-corpus-wrap {
margin: 1.25rem 0;
overflow-x: auto;
}
.verify-corpus {
border-collapse: separate;
border-spacing: 0;
width: 100%;
min-width: 1120px;
font-size: 0.94rem;
line-height: 1.35;
border: 1px solid #d7dde8;
border-radius: 12px;
overflow: hidden;
}
.verify-corpus th {
background: #162033;
color: #ffffff;
text-align: left;
font-weight: 650;
padding: 0.75rem 0.85rem;
border-right: 1px solid rgba(255,255,255,0.16);
white-space: nowrap;
}
.verify-corpus td {
padding: 0.72rem 0.85rem;
vertical-align: top;
border-top: 1px solid #e8edf5;
border-right: 1px solid #eef2f7;
background: #ffffff;
}
.verify-corpus tr:nth-child(even) td {
background: #f8fafc;
}
.verify-corpus td.position {
width: 16rem;
font-weight: 620;
color: #192234;
}
.verify-corpus td.fen {
width: 33rem;
font-family: ui-monospace, SFMono-Regular, Consolas, “Liberation Mono”, monospace;
font-size: 0.86rem;
color: #1b365d;
overflow-wrap: anywhere;
}
.verify-corpus td.num {
text-align: right;
white-space: nowrap;
font-variant-numeric: tabular-nums;
color: #10233f;
}
.verify-corpus td.na {
text-align: center;
color: #738096;
}
.verify-note {
margin: 0.75rem 0 1.1rem;
padding: 0.85rem 1rem;
border-left: 4px solid #3b6ea8;
background: #f3f7fc;
color: #25364f;
}
| Position | FEN | d8 nodes | d9 nodes | d10 nodes | d11 nodes |
|---|---|---|---|---|---|
| Standard chess starting position | rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq – 0 1 | 84,998,978,956 | 2,439,530,234,167 | 69,352,859,712,417 | 2,097,651,003,696,806 |
| Kiwipete castling, pin, and tactical validation position | r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq – 0 1 | 15,493,944,087,984 | 708,027,759,953,502 | – | – |
| En passant and endgame validation position | 8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w – – 0 1 | 3,009,794,393 | 50,086,749,815 | – | – |
| Promotion and castling-rights validation position | r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq – 0 1 | 1,209,257,875,296 | 47,475,324,529,267 | – | – |
| Mirrored promotion and castling-rights validation position | r2q1rk1/pP1p2pp/Q4n2/bbp1p3/Np6/1B3NBn/pPPP1PPP/R3K2R b KQ – 0 1 | 1,209,257,875,296 | 47,475,324,529,267 | – | – |
| Tactical validation position with promoted-piece and castling-state edge cases | rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ – 1 8 | 4,509,347,606,439 | 195,961,227,207,328 | – | – |
| Complex middlegame validation position with dense legal move generation | r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w – – 0 10 | 11,923,589,843,526 | 490,154,852,788,714 | – | – |
| Simple queen-and-king mate net | 7k/6pp/6Q1/5K2/8/8/8/8 w – – 0 1 | 115,390,317 | 2,929,540,282 | – | – |
| King-and-queen versus king mate-net position | 8/8/8/8/3Q4/k7/8/1K6 w – – 0 1 | 56,019,809 | 1,465,773,248 | – | – |
| Promotion-race mate-net position | 5B2/6P1/1p6/8/1N6/kP6/2K5/8 w – – 0 1 | 9,825,624 | 237,644,627 | – | – |
| Light-piece mate-net tactical position | 7r/p3R3/BpkP4/2b1P1p1/8/1K2n1B1/P5P1/8 w – – 1 1 | 244,206,784,213 | 6,790,744,524,028 | – | – |
| Kings-only legal-move baseline | 8/8/8/3k4/8/4K3/8/8 w – – 0 1 | 5,779,699 | 39,116,077 | – | – |
| King-and-pawn versus king endgame | 8/8/8/3k4/8/4K3/4P3/8 w – – 0 1 | 6,631,390 | 52,514,066 | – | – |
| Rook-versus-king endgame | 8/8/8/3k4/8/4K3/4R3/8 w – – 0 1 | 117,915,246 | 2,369,689,422 | – | – |
| Queen-versus-king endgame | 8/8/8/3k4/8/4K3/4Q3/8 w – – 0 1 | 217,233,519 | 6,031,342,299 | – | – |
| Deterministic random-walk middlegame, ply 24 | r3k1nr/pppbq2p/6nb/P4pp1/2pP4/2P5/1P1NPPPP/R1B1KBR1 w Qkq – 1 13 | 767,960,814,592 | 19,922,750,017,528 | – | – |
| Deterministic random-walk late-middlegame, ply 48 | 3rkb1r/5q2/6Pn/1p1p1p1p/p4P2/p1P3PN/P2P4/RN3K1R w k – 0 25 | 127,001,516,784 | 2,865,809,814,110 | – | – |
| Deterministic random-walk late-game position, ply 64 | 1r2k3/4p1pr/p7/2p3p1/bP4Pp/2pNP1nB/P7/1RB1K2R w – – 1 33 | 327,588,202,808 | 8,640,609,745,333 | – | – |
Use In The Release Process
The --verify corpus is intended to catch both correctness regressions and performance regressions before a GPUPerft CDP2 release artifact is staged. The individual positions are deliberately varied: some produce very dense legal move expansion, some emphasize rare rule handling, and others are compact enough to make exact high-depth checks practical during iteration.
For publication, the table should be treated as a reference list of expected perft values. Timing and throughput measurements are tracked in separate release-validation reports because they depend on hardware, driver state, build flags, and runtime configuration.