a work-in-progress UCI chess and chess960 engine, with NNUE evaluation trained from zero knowledge starting with random weights
this project is a continuation of my HCE engine Polaris
Version | CCRL 40/15 | CCRL Blitz | CCRL 40/2 FRC | SPCC | MCERL |
---|---|---|---|---|---|
2.0.0 | - | - | 3639 | - | - |
1.0.0 | 3254 | 3364 | 3513 | 3344 | 3342 |
- standard PVS with quiescence search and iterative deepening
- aspiration windows
- check extensions
- countermoves
- futility pruning
- history
- capture history
- countermove history (1-ply continuation history)
- follow-up history (2-ply continuation history)
- internal iterative reduction
- killers (1 per ply)
- late move reductions
- mate distance pruning
- multicut
- nullmove pruning
- reverse futility pruning
- SEE move ordering and pruning
- singular extensions
- Syzygy tablebase support
- NNUE
- (768->384)x2->1 architecture
- trained from zero knowledge with reinforcement learning from a randomly-initialised network
- BMI2 attacks in the
bmi2
build, otherwise fancy black magicpext
/pdep
for rookspext
for bishops
- lazy SMP
- static contempt
- tune search constants
- make it stronger uwu
Name | Type | Default value | Valid values | Description |
---|---|---|---|---|
Hash | integer | 64 | [1, 131072] | Memory allocated to the transposition table (in MB). |
Clear Hash | button | N/A | N/A | Clears the transposition table. |
Threads | integer | 1 | [1, 2048] | Number of threads used to search. |
UCI_Chess960 | check | false |
false , true |
Whether Stormphrax plays Chess960 instead of standard chess. |
UCI_ShowWDL | check | true |
false , true |
Whether Stormphrax displays predicted win/draw/loss probabilities in UCI output. |
Move Overhead | integer | 10 | [0, 50000] | Amount of time Stormphrax assumes to be lost to overhead when making a move (in ms). |
SyzygyPath | string | <empty> |
any path, or <empty> |
Location of Syzygy tablebases to probe during search. |
SyzygyProbeDepth | spin | 1 | [1, 255] | Minimum depth to probe Syzygy tablebases at. |
SyzygyProbeLimit | spin | 7 | [0, 7] | Maximum number of pieces on the board to probe Syzygy tablebases with. |
EvalFile | string | <internal> |
any path, or <internal> |
NNUE file to use for evaluation. |
avx512
: requires AVX-512 (Zen 4, Skylake-X)
avx2-bmi2
: requires BMI2 and AVX2 and assumes fast pext
and pdep
(i.e. no Zen 1 and 2)
avx2
: requires BMI and AVX2 - primarily useful for pre-Zen 3 AMD CPUs back to Excavator
sse41-popcnt
: needs SSE 4.1 and popcnt
- for older x64 CPUs
Alternatively, build the CMake target stormphrax-native
for a binary tuned for your specific CPU (see below)
(note that this does not automatically disable pext
and pdep
for pre-Zen 3 AMD CPUs that implement them in microcode)
- If you have an AMD Zen 1 (Ryzen x 1xxx) or 2 (Ryzen x 2xxx) CPU, use the
avx2
build even though your CPU supports BMI2. These CPUs implement the BMI2 instructionspext
andpdep
in microcode, which makes them unusably slow for Stormphrax's purposes.
The makefile is not intended for building by users. It exists purely for OpenBench compliance.
Requires CMake and a competent C++20 compiler. Currently, GCC is known to vectorise Stormphrax's NNUE code very poorly compared to Clang.
> cmake -DCMAKE_BUILD_TYPE=Release -S . -B build/
> cmake --build build/ --target stormphrax-<TARGET>
(replace <TARGET>
with your preferred target - native
/avx512
/avx2-bmi2
/avx2
/sse41-popcnt
)
If you have a pre-Zen 3 AMD Ryzen CPU (see the notes in Builds above) and want to build the native
target, use these commands instead (the second is unchanged):
> cmake -DCMAKE_BUILD_TYPE=Release -DSP_FAST_PEXT=OFF -S . -B build/
> cmake --build build/ --target stormphrax-native
Disabling the CMake option SP_FAST_PEXT
builds the non-BMI2 attack getters.
Stormphrax uses Fathom for tablebase probing, licensed under the MIT license, and a slightly modified version of incbin for embedding neural network files, under the Unlicense.
The name "Stormphrax" is a reference to the excellent Edge Chronicles :)