mirror of
https://github.com/sockspls/badfish
synced 2025-04-29 16:23:09 +00:00
325 lines
15 KiB
Markdown
325 lines
15 KiB
Markdown
## Overview
|
|
|
|
[](https://travis-ci.org/official-stockfish/Stockfish)
|
|
[](https://ci.appveyor.com/project/mcostalba/stockfish/branch/master)
|
|
|
|
[Stockfish](https://stockfishchess.org) is a free, powerful UCI chess engine
|
|
derived from Glaurung 2.1. Stockfish is not a complete chess program and requires a
|
|
UCI-compatible graphical user interface (GUI) (e.g. XBoard with PolyGlot, Scid,
|
|
Cute Chess, eboard, Arena, Sigma Chess, Shredder, Chess Partner or Fritz) in order
|
|
to be used comfortably. Read the documentation for your GUI of choice for information
|
|
about how to use Stockfish with it.
|
|
|
|
The Stockfish engine features two evaluation functions for chess, the classical
|
|
evaluation based on handcrafted terms, and the NNUE evaluation based on efficiently
|
|
updateable neural networks. The classical evaluation runs efficiently on almost all
|
|
CPU architectures, while the NNUE evaluation benefits from the vector
|
|
intrinsics available on most CPUs (sse2, avx2, neon, or similar).
|
|
|
|
|
|
## Files
|
|
|
|
This distribution of Stockfish consists of the following files:
|
|
|
|
* Readme.md, the file you are currently reading.
|
|
|
|
* Copying.txt, a text file containing the GNU General Public License version 3.
|
|
|
|
* src, a subdirectory containing the full source code, including a Makefile
|
|
that can be used to compile Stockfish on Unix-like systems.
|
|
|
|
* a file with the .nnue extension, storing the neural network for the NNUE
|
|
evaluation. Binary distributions will have this file embedded.
|
|
|
|
Note: to use the NNUE evaluation, the additional data file with neural network parameters
|
|
needs to be available. Normally, this file is already embedded in the binary or it can be downloaded.
|
|
The filename for the default (recommended) net can be found as the default
|
|
value of the `EvalFile` UCI option, with the format `nn-[SHA256 first 12 digits].nnue`
|
|
(for instance, `nn-c157e0a5755b.nnue`). This file can be downloaded from
|
|
```
|
|
https://tests.stockfishchess.org/api/nn/[filename]
|
|
```
|
|
replacing `[filename]` as needed.
|
|
|
|
|
|
## UCI options
|
|
|
|
Currently, Stockfish has the following UCI options:
|
|
|
|
* #### Threads
|
|
The number of CPU threads used for searching a position. For best performance, set
|
|
this equal to the number of CPU cores available.
|
|
|
|
* #### Hash
|
|
The size of the hash table in MB. It is recommended to set Hash after setting Threads.
|
|
|
|
* #### Ponder
|
|
Let Stockfish ponder its next move while the opponent is thinking.
|
|
|
|
* #### MultiPV
|
|
Output the N best lines (principal variations, PVs) when searching.
|
|
Leave at 1 for best performance.
|
|
|
|
* #### Use NNUE
|
|
Toggle between the NNUE and classical evaluation functions. If set to "true",
|
|
the network parameters must be available to load from file (see also EvalFile),
|
|
if they are not embedded in the binary.
|
|
|
|
* #### EvalFile
|
|
The name of the file of the NNUE evaluation parameters. Depending on the GUI the
|
|
filename might have to include the full path to the folder/directory that contains the file.
|
|
Other locations, such as the directory that contains the binary and the working directory,
|
|
are also searched.
|
|
|
|
* #### UCI_AnalyseMode
|
|
An option handled by your GUI.
|
|
|
|
* #### UCI_Chess960
|
|
An option handled by your GUI. If true, Stockfish will play Chess960.
|
|
|
|
* #### UCI_ShowWDL
|
|
If enabled, show approximate WDL statistics as part of the engine output.
|
|
These WDL numbers model expected game outcomes for a given evaluation and
|
|
game ply for engine self-play at fishtest LTC conditions (60+0.6s per game).
|
|
|
|
* #### UCI_LimitStrength
|
|
Enable weaker play aiming for an Elo rating as set by UCI_Elo. This option overrides Skill Level.
|
|
|
|
* #### UCI_Elo
|
|
If enabled by UCI_LimitStrength, aim for an engine strength of the given Elo.
|
|
This Elo rating has been calibrated at a time control of 60s+0.6s and anchored to CCRL 40/4.
|
|
|
|
* #### Skill Level
|
|
Lower the Skill Level in order to make Stockfish play weaker (see also UCI_LimitStrength).
|
|
Internally, MultiPV is enabled, and with a certain probability depending on the Skill Level a
|
|
weaker move will be played.
|
|
|
|
* #### SyzygyPath
|
|
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`
|
|
|
|
It is recommended to store .rtbw files on an SSD. There is no loss in storing
|
|
the .rtbz files on a regular HD. It is recommended to verify all md5 checksums
|
|
of the downloaded tablebase files (`md5sum -c checksum.md5`) as corruption will
|
|
lead to engine crashes.
|
|
|
|
* #### SyzygyProbeDepth
|
|
Minimum remaining search depth for which a position is probed. Set this option
|
|
to a higher value to probe less agressively if you experience too much slowdown
|
|
(in terms of nps) due to TB probing.
|
|
|
|
* #### Syzygy50MoveRule
|
|
Disable to let fifty-move rule draws detected by Syzygy tablebase probes count
|
|
as wins or losses. This is useful for ICCF correspondence games.
|
|
|
|
* #### SyzygyProbeLimit
|
|
Limit Syzygy tablebase probing to positions with at most this many pieces left
|
|
(including kings and pawns).
|
|
|
|
* #### Contempt
|
|
A positive value for contempt favors middle game positions and avoids draws,
|
|
effective for the classical evaluation only.
|
|
|
|
* #### Analysis Contempt
|
|
By default, contempt is set to prefer the side to move. Set this option to "White"
|
|
or "Black" to analyse with contempt for that side, or "Off" to disable contempt.
|
|
|
|
* #### Move Overhead
|
|
Assume a time delay of x ms due to network and GUI overheads. This is useful to
|
|
avoid losses on time in those cases.
|
|
|
|
* #### Slow Mover
|
|
Lower values will make Stockfish take less time in games, higher values will
|
|
make it think longer.
|
|
|
|
* #### nodestime
|
|
Tells the engine to use nodes searched instead of wall time to account for
|
|
elapsed time. Useful for engine testing.
|
|
|
|
* #### Clear Hash
|
|
Clear the hash table.
|
|
|
|
* #### Debug Log File
|
|
Write all communication to and from the engine into a text file.
|
|
|
|
## A note on classical and NNUE evaluation
|
|
|
|
Both approaches assign a value to a position that is used in alpha-beta (PVS) search
|
|
to find the best move. The classical evaluation computes this value as a function
|
|
of various chess concepts, handcrafted by experts, tested and tuned using fishtest.
|
|
The NNUE evaluation computes this value with a neural network based on basic
|
|
inputs (e.g. piece positions only). The network is optimized and trained
|
|
on the evalutions of millions of positions at moderate search depth.
|
|
|
|
The NNUE evaluation was first introduced in shogi, and ported to Stockfish afterward.
|
|
It can be evaluated efficiently on CPUs, and exploits the fact that only parts
|
|
of the neural network need to be updated after a typical chess move.
|
|
[The nodchip repository](https://github.com/nodchip/Stockfish) provides additional
|
|
tools to train and develop the NNUE networks.
|
|
|
|
On CPUs supporting modern vector instructions (avx2 and similar), the NNUE evaluation
|
|
results in stronger playing strength, even if the nodes per second computed by the engine
|
|
is somewhat lower (roughly 60% of nps is typical).
|
|
|
|
Note that the NNUE evaluation depends on the Stockfish binary and the network parameter
|
|
file (see EvalFile). Not every parameter file is compatible with a given Stockfish binary.
|
|
The default value of the EvalFile UCI option is the name of a network that is guaranteed
|
|
to be compatible with that binary.
|
|
|
|
## What to expect from Syzygybases?
|
|
|
|
If the engine is searching a position that is not in the tablebases (e.g.
|
|
a position with 8 pieces), it will access the tablebases during the search.
|
|
If the engine reports a very large score (typically 153.xx), this means
|
|
that it has found a winning line into a tablebase position.
|
|
|
|
If the engine is given a position to search that is in the tablebases, it
|
|
will use the tablebases at the beginning of the search to preselect all
|
|
good moves, i.e. all moves that preserve the win or preserve the draw while
|
|
taking into account the 50-move rule.
|
|
It will then perform a search only on those moves. **The engine will not move
|
|
immediately**, unless there is only a single good move. **The engine likely
|
|
will not report a mate score even if the position is known to be won.**
|
|
|
|
It is therefore clear that this behaviour is not identical to what one might
|
|
be used to with Nalimov tablebases. There are technical reasons for this
|
|
difference, the main technical reason being that Nalimov tablebases use the
|
|
DTM metric (distance-to-mate), while Syzygybases use a variation of the
|
|
DTZ metric (distance-to-zero, zero meaning any move that resets the 50-move
|
|
counter). This special metric is one of the reasons that Syzygybases are
|
|
more compact than Nalimov tablebases, while still storing all information
|
|
needed for optimal play and in addition being able to take into account
|
|
the 50-move rule.
|
|
|
|
## Stockfish on distributed memory systems
|
|
|
|
The cluster branch allows for running Stockfish on a cluster of servers (nodes)
|
|
that are connected with a high-speed and low-latency network, using the message
|
|
passing interface (MPI). In this case, one MPI process should be run per node,
|
|
and UCI options can be used to set the number of threads/hash per node as usual.
|
|
Typically, the engine will be invoked as
|
|
```
|
|
mpirun -np N /path/to/stockfish
|
|
```
|
|
where ```N``` stands for the number of MPI processes used (alternatives to ```mpirun```,
|
|
include ```mpiexec```, ```srun```). Use 1 mpi rank per node, and employ threading
|
|
according to the cores per node. To build the cluster
|
|
branch, it is sufficient to specify ```COMPILER=mpicxx``` on the make command line,
|
|
and do a clean build:
|
|
```
|
|
make -j ARCH=x86-64-modern clean build COMPILER=mpicxx
|
|
```
|
|
If the name of the compiler wrapper (typically mpicxx, but sometimes e.g. CC) does
|
|
not match ```mpi``` an edit to the Makefile is required. Make sure that the MPI
|
|
installation is configured to support ```MPI_THREAD_MULTIPLE```, this might require
|
|
adding system specific compiler options to the Makefile. Stockfish employs
|
|
non-blocking (asynchronous) communication, and benefits from an MPI
|
|
implementation that efficiently supports this. Some MPI implentations might benefit
|
|
from leaving 1 core/thread free for these asynchronous communications, and might require
|
|
setting additional environment variables. ```mpirun``` should forward stdin/stdout
|
|
to ```rank 0``` only (e.g. ```srun --input=0 --output=0```).
|
|
Refer to your MPI documentation for more info.
|
|
|
|
## Large Pages
|
|
|
|
Stockfish supports large pages on Linux and Windows. Large pages make
|
|
the hash access more efficient, improving the engine speed, especially
|
|
on large hash sizes. Typical increases are 5..10% in terms of nps, but
|
|
speed increases up to 30% have been measured. The support is
|
|
automatic. Stockfish attempts to use large pages when available and
|
|
will fall back to regular memory allocation when this is not the case.
|
|
|
|
### Support on Linux
|
|
|
|
Large page support on Linux is obtained by the Linux kernel
|
|
transparent huge pages functionality. Typically, transparent huge pages
|
|
are already enabled and no configuration is needed.
|
|
|
|
### Support on Windows
|
|
|
|
The use of large pages requires "Lock Pages in Memory" privilege. See
|
|
[Enable the Lock Pages in Memory Option (Windows)](https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/enable-the-lock-pages-in-memory-option-windows)
|
|
on how to enable this privilege. Logout/login may be needed
|
|
afterwards. Due to memory fragmentation, it may not always be
|
|
possible to allocate large pages even when enabled. A reboot
|
|
might alleviate this problem. To determine whether large pages
|
|
are in use, see the engine log.
|
|
|
|
## Compiling Stockfish yourself from the sources
|
|
|
|
Stockfish has support for 32 or 64-bit CPUs, certain hardware
|
|
instructions, big-endian machines such as Power PC, and other platforms.
|
|
|
|
On Unix-like systems, it should be easy to compile Stockfish
|
|
directly from the source code with the included Makefile in the folder
|
|
`src`. In general it is recommended to run `make help` to see a list of make
|
|
targets with corresponding descriptions.
|
|
|
|
```
|
|
cd src
|
|
make help
|
|
make build ARCH=x86-64-modern
|
|
make net
|
|
```
|
|
|
|
When not using the Makefile to compile (for instance with Microsoft MSVC) you
|
|
need to manually set/unset some switches in the compiler command line; see
|
|
file *types.h* for a quick reference.
|
|
|
|
When reporting an issue or a bug, please tell us which version and
|
|
compiler you used to create your executable. These informations can
|
|
be found by typing the following commands in a console:
|
|
|
|
```
|
|
./stockfish compiler
|
|
```
|
|
|
|
## Understanding the code base and participating in the project
|
|
|
|
Stockfish's improvement over the last couple of years has been a great
|
|
community effort. There are a few ways to help contribute to its growth.
|
|
|
|
### Donating hardware
|
|
|
|
Improving Stockfish requires a massive amount of testing. You can donate
|
|
your hardware resources by installing the [Fishtest Worker](https://github.com/glinscott/fishtest/wiki/Running-the-worker:-overview)
|
|
and view the current tests on [Fishtest](https://tests.stockfishchess.org/tests).
|
|
|
|
### Improving the code
|
|
|
|
If you want to help improve the code, there are several valuable resources:
|
|
|
|
* [In this wiki,](https://www.chessprogramming.org) many techniques used in
|
|
Stockfish are explained with a lot of background information.
|
|
|
|
* [The section on Stockfish](https://www.chessprogramming.org/Stockfish)
|
|
describes many features and techniques used by Stockfish. However, it is
|
|
generic rather than being focused on Stockfish's precise implementation.
|
|
Nevertheless, a helpful resource.
|
|
|
|
* The latest source can always be found on [GitHub](https://github.com/official-stockfish/Stockfish).
|
|
Discussions about Stockfish take place in the [FishCooking](https://groups.google.com/forum/#!forum/fishcooking)
|
|
group and engine testing is done on [Fishtest](https://tests.stockfishchess.org/tests).
|
|
If you want to help improve Stockfish, please read this [guideline](https://github.com/glinscott/fishtest/wiki/Creating-my-first-test)
|
|
first, where the basics of Stockfish development are explained.
|
|
|
|
|
|
## Terms of use
|
|
|
|
Stockfish is free, and distributed under the **GNU General Public License version 3**
|
|
(GPL v3). Essentially, this means that you are free to do almost exactly
|
|
what you want with the program, including distributing it among your
|
|
friends, making it available for download from your web site, selling
|
|
it (either by itself or as part of some bigger software package), or
|
|
using it as the starting point for a software project of your own.
|
|
|
|
The only real limitation is that whenever you distribute Stockfish in
|
|
some way, you must always include the full source code, or a pointer
|
|
to where the source code can be found. If you make any changes to the
|
|
source code, these changes must also be made available under the GPL.
|
|
|
|
For full details, read the copy of the GPL v3 found in the file named
|
|
*Copying.txt*.
|