This is a C port of Stockfish.
Compiling Cfish requires a working gcc or clang environment. The MSYS2 environment is recommended for compiling Cfish on Windows (see below on how to set up MSYS2).
To compile, type:
make target [ARCH=arch] [COMP=compiler] [COMPCC=gcc-4.8] [further options]
from the src
directory. Lists of supported targets, archs and compilers can be viewed by typing make
or make help
.
If the ARCH
variable is not set or is set to auto
, the Makefile will attempt to determine and use the optimal settings for your system. If this fails with an error or gives unsatisfactory results, you should set the desired architecture manually.
Be aware that a Cfish binary compiled specifically for your machine may not work on other (older) machines. If the binary has to work on multiple machines, set ARCH
to the architecture that corresponds to the oldest/least capable machine.
Further options:
nnue=no | Do not include NNUE code |
pure=yes | NNUE pure only (no hybrid or classical mode) |
sparse=yes/no | Enable/disable NNUE sparse multiplication |
numa=no | Disable NUMA support |
lto=yes | Compile with link-time optimization |
extra=yes | Compile with extra optimization options (gcc-7.x and higher) |
The sparse
option selects between two different NNUE implementations.
The option sparse=yes
is likely superior (i.e. higher nps) for ARM-based CPUs, for Intel CPUs that do not support AVX2, and for AMD CPUs before Zen 3 (i.e. Ryzen 5000).
Add numa=no
if compilation fails withnuma.h: No such file or directory
or cannot find -lnuma
.
The optimization options currently enabled with extra=yes
appear to be less effective now that the NNUE code has been added.
A positive contempt value lets Cfish evaluate a position more favourably the more material is left on the board.
By default, contempt is set to zero during analysis to ensure unbiased analysis. Set this option to White or Black to analyse with contempt for that side.
The number of CPU threads used for searching a position.
The size of the hash table in MB.
Clear the hash table.
Let Cfish ponder its next move while the opponent is thinking.
Output the N best lines when searching. Leave at 1 for best performance.
Compensation for network and GUI delay (in ms).
Increase to make Cfish use more time, decrease to make Cfish use less time.
Path to the folders/directories storing the Syzygy tablebase files. Multiple directories are to be separated by ";" on Windows and by ":" on Unix-based operating systems. Do not use spaces around the ";" or ":".
Example: C:\tablebases\wdl345;C:\tablebases\wdl6;D:\tablebases\dtz345;D:\tablebases\dtz6
Minimum remaining search depth for which a position is probed. Increase this value to probe less aggressively.
Disable to let fifty-move rule draws detected by Syzygy tablebase probes count as wins or losses. This is useful for ICCF correspondence games.
Limit Syzygy tablebase probing to positions with at most this many pieces left (including kings and pawns).
Use Syzygy DTM tablebases (not yet released).
Control PolyGlot book usage.
Name of NNUE network file.
By default, Cfish uses NNUE in Stockfish's Hybrid mode, where certain positions are evaluated with the old handcrafted evaluation. Other modes are Pure (NNUE only) and Classical (handcrafted evaluation only).
Control allocation of the hash table as Large Pages (LP). On Windows this option does not appear if the operating system lacks LP support or if LP has not properly been set up.
This option only appears on NUMA machines, i.e. machines with two or more CPUs. If this option is set to "on" or "all", Cfish will spread its search threads over all nodes. If the option is set to "off", Cfish will ignore the NUMA architecture of the machine. On Linux, a subset of nodes may be specified on which to run the search threads (e.g. "0-1" or "0,1" to limit the search threads to nodes 0 and 1 out of nodes 0-3).
- Download and install MSYS2 from the MSYS2 website.
- Open an MSYS2 MinGW 64-bit terminal (e.g. via the Windows Start menu).
- Install the MinGW 64-bit toolchain by entering
pacman -S mingw-w64-x86_64-toolchain
. - Close the MSYS2 MinGW 64-bit terminal and open another.
Vafra Cfish, maintained by Robert Jurjevic since Cfish 12, takes its name from the Latin word vafra, meaning "crafty," as a nod to Robert’s earlier work on a Crafty clone, created by Professor Robert Hyatt.
Vafra Cfish uses the flipped, not rotated, HalfKP 256x2-32-32-1 NNUE architecture. Robert trains the NNUE exclusively on Leela data, employing a combination of tools for data conversion. He uses a C# suite he developed to filter out FRC positions from the Leela dataset, as Vafra is specifically tuned for standard chess rather than FRC. Additionally, some FRC positions output by Leela’s rescorer tool use a non-standard format that, when converted, can cause Nodchip’s trainer to crash. To address this, Robert’s pipeline ensures that such positions are excluded. He also utilizes the tools version of Stockfish, which can read textual FEN format output from Leela’s rescorer and convert it into Stockfish’s binary FEN format.
The training itself is conducted using Robert’s ever-so-slightly modified version of Nodchip’s trainer, allowing him to fine-tune the process and adapt the training schedule and parameters for optimal results. This automated and customized pipeline ensures efficient and robust preparation and training of NNUE nets from scratch.
Robert thanks the Stockfish team for creating Stockfish and for the opportunity to briefly be an informal member of the team, where he learned more about the process. He also extends his gratitude to the Leela team for publicly providing their data and the rescorer program, as well as to Ronald de Man for creating Cfish.