#chess #perft #game #chess-game #node-count

bin+lib lperft

A blazingly fast, multithreaded perft tool

1 unstable release

new 0.1.0 Mar 29, 2025

#6 in #perft

GPL-3.0 license

27KB
513 lines

lperft

Build Version Release License

lperft is a blazingly fast, multithreaded perft tool designed for command-line use, ideal for debugging chess move generators. It calculates the total number of nodes from a given chess position and outputs a list of all legal moves, along with their respective node counts at the specified depth.

Installation and Compilation

You have several options for installing lperft:

1. Install using Cargo

The easiest way to install lperft is by using Cargo, the Rust package manager. In your terminal, run the following command:

cargo install lperft

This will download and compile the latest version of lperft from crates.io.

2. Download Precompiled Binary

If you prefer not to compile the program yourself, you can download a precompiled binary from the Releases section of the repository. Simply download the appropriate version for your system and run the binary directly.

3. Compile from Source

If you want to compile lperft natively for your processor, make sure you have Rust installed. Then, you can clone the repository and build the project with the following commands:

git clone https://github.com/HansTibberio/lperft.git
cd lperft
RUSTFLAGS="-C target-cpu=native" cargo build --release

For even better performance, you can enable the bmi2 feature by using the following command to build with this optimization:

RUSTFLAGS="-C target-cpu=native" cargo build --release --features bmi2

With any of these methods, you'll be able to run lperft directly from the command line once the installation or build process is complete.

Usage

lperft is executed from the command line as follows:

lperft [OPTIONS] --depth <DEPTH>

Example Usage

To run lperft on the default starting position with a search depth of 7 and use 2 threads:

lperft --depth 7 --threads 2

To analyze a custom position using a FEN string (e.g., a specific position from a game), set the depth to 6, and use a 128MB transposition table:

lperft --fen "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1" --depth 6 --hash 128

Available Options

  • -f, --fen <FEN> Specifies the position in FEN format (enclosed in quotes).
    If omitted, the default starting position is used:
    "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"

  • -d, --depth <DEPTH>
    The search depth to evaluate.

  • -H, --hash <HASH>
    The size of the transposition table in megabytes (optional).
    If not specified, the search will proceed without a transposition table.

  • -t, --threads <THREADS>
    The number of threads to use for parallel node search.
    By default, 1 thread is used.

Benchmarks

Below are the benchmarks for lperft, measuring its performance on Perft(7), Perft(8), and Perft(9) from the starting position and the well-known Kiwipete position.

Starting Position Benchmarks

Depth Hash (MB) Threads Time NPS
7 0 1 5.052 s 632,580,821
7 0 2 2.606 s 1,226,088,379
7 64 1 1.655 s 1,930,084,154
7 128 1 1.620 s 1,972,545,265
7 64 2 845 ms 3,780,542,314
7 128 2 825 ms 3,870,346,038
8 1024 8 4.087 s 20,794,666,969
8 1024 12 3.192 s 26,624,967,590
9 8192 12 37.560 s 64,949,336,635

Kiwipete Benchmarks

Depth Hash (MB) Threads Time NPS
7 4096 12 10.294 s 36,348,767,805
8 8192 12 247.768 s 62,533,872,605

Test system: AMD Ryzen 5 5600G (3.9 GHz), 32 GB DDR4 3200 MHz, Windows 10

License

This project is licensed under GPLv3. See the LICENSE file for details.

Dependencies

~3.5MB
~62K SLoC