mirror of
https://github.com/official-stockfish/Stockfish.git
synced 2026-07-22 12:47:08 +00:00
Performance on Spacemit K3, thanks @edolnx for testing master: Total time (ms) : 65200 Nodes searched : 3493826 Nodes/second : 53586 riscv-scalable-port: Total time (ms) : 15834 Nodes searched : 3493826 Nodes/second : 220653 Also thanks to @camel-cdr for guidance on RVV programming, and https://cloud-v.co for supplying an RVV instance to test with passed STC: LLR: 2.81 (-2.94,2.94) <0.00,2.00> Total: 1152 W: 527 L: 108 D: 517 Ptnml(0-2): 0, 17, 167, 348, 44 https://tests.stockfishchess.org/tests/view/6a39895b3036e45021aeb368 ## Summary We've had a `riscv64` target for a while, but haven't really optimized for it, in particular the vector extension (RVV). RVV, like SVE, is based on a scalable vector system where the vector length ranges from 128 to 65536. In practice implementations are between 128 and 2048, and 256 bits is quite common (e.g. the Spacemit K3 system above). Unfortunately this doesn't fit well into the rest of our code which assumes a fixed vector length, so what I've done is bypass the `VECTOR` ifdef (which now basically means "FIXED_LENGTH_VECTOR") and just have RVV-specific paths. The ability to explicitly control `vl` makes the code quite readable, in my opinion. We use LMUL>1 in most places to take advantage of multi-vector instructions. Generally the LMULs were chosen to best support a 256-bit vlen, which is very common, but by virtue of how the vlen control works, the code works with any vlen. In a couple places, i.e., `get_changed_pieces` and `AffineTransformSparseInput::propagate`, we have separate implementations depending on the vlen, because the optimal LMUL varies a lot between implementations. One little wrinkle is that `load_as` is compiled to a sequence of byte loads, because although unaligned loads are legal in RVA23, the spec says that they *may* be extremely slow (even though they usually aren't, in actual hw), so compilers are conservative. Thus I aligned the relevant buffers and made the semantics of `load_as` that the operand is aligned, by adding a runtime assertion. ### Universal binary Adding a universal binary is pretty easy and we can just cross-compile. There are two targets: baseline rv64gc and riscv64-rva23, which is actually a smaller subset of RVA23 that also works on some older processors that don't support the full thing. We use clang because GCC, until recently, has a nasty bug with LTO and RVV. Like the universal ARM and x86 builds, we check all the builds in CI. In this case we run bench with multiple vlens, 128 through 1024. In the meantime I deleted the existing broken and unused riscv64 tests. ### Follow-ups - Optimizations - zvdot4a8i path closes https://github.com/official-stockfish/Stockfish/pull/6920 No functional change
406 lines
13 KiB
YAML
406 lines
13 KiB
YAML
name: Tests
|
|
on:
|
|
workflow_call:
|
|
jobs:
|
|
Test-Targets:
|
|
name: ${{ matrix.config.name }}
|
|
runs-on: ${{ matrix.config.os }}
|
|
env:
|
|
COMPCXX: ${{ matrix.config.compiler }}
|
|
COMP: ${{ matrix.config.comp }}
|
|
CXXFLAGS: "-Werror"
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
config:
|
|
- name: Ubuntu 22.04 GCC
|
|
os: ubuntu-22.04
|
|
compiler: g++
|
|
comp: gcc
|
|
run_32bit_tests: true
|
|
run_64bit_tests: true
|
|
shell: bash
|
|
- name: Ubuntu 22.04 Clang
|
|
os: ubuntu-22.04
|
|
compiler: clang++
|
|
comp: clang
|
|
run_32bit_tests: true
|
|
run_64bit_tests: true
|
|
shell: bash
|
|
- name: Android NDK aarch64
|
|
os: ubuntu-22.04
|
|
compiler: aarch64-linux-android29-clang++
|
|
comp: ndk
|
|
run_armv8_tests: true
|
|
shell: bash
|
|
- name: Android NDK arm
|
|
os: ubuntu-22.04
|
|
compiler: armv7a-linux-androideabi29-clang++
|
|
comp: ndk
|
|
run_armv7_tests: true
|
|
shell: bash
|
|
- name: Linux GCC ppc64
|
|
os: ubuntu-22.04
|
|
compiler: g++
|
|
comp: gcc
|
|
run_ppc64_tests: true
|
|
base_image: "ppc64le/alpine:latest"
|
|
platform: linux/ppc64le
|
|
shell: bash
|
|
- name: Linux GCC loongarch64
|
|
os: ubuntu-22.04
|
|
compiler: g++
|
|
comp: gcc
|
|
run_loongarch64_tests: true
|
|
base_image: "loongarch64/alpine:3.21"
|
|
platform: linux/loong64
|
|
shell: bash
|
|
- name: macOS 15 Apple Clang
|
|
os: macos-15-intel
|
|
compiler: clang++
|
|
comp: clang
|
|
run_64bit_tests: true
|
|
shell: bash
|
|
- name: macOS 15 Apple Clang M1
|
|
os: macos-15
|
|
compiler: clang++
|
|
comp: clang
|
|
run_64bit_tests: false
|
|
run_m1_tests: true
|
|
shell: bash
|
|
- name: macOS 15 GCC 11
|
|
os: macos-15-intel
|
|
compiler: g++-11
|
|
comp: gcc
|
|
run_64bit_tests: true
|
|
shell: bash
|
|
- name: Windows 2022 Mingw-w64 GCC x86_64
|
|
os: windows-2022
|
|
compiler: g++
|
|
comp: mingw
|
|
run_64bit_tests: true
|
|
msys_sys: mingw64
|
|
msys_env: x86_64-gcc
|
|
shell: msys2 {0}
|
|
- name: Windows 2022 Mingw-w64 GCC i686
|
|
os: windows-2022
|
|
compiler: g++
|
|
comp: mingw
|
|
run_32bit_tests: true
|
|
msys_sys: mingw32
|
|
msys_env: i686-gcc
|
|
shell: msys2 {0}
|
|
- name: Windows 2022 Mingw-w64 Clang x86_64
|
|
os: windows-2022
|
|
compiler: clang++
|
|
comp: clang
|
|
run_64bit_tests: true
|
|
msys_sys: clang64
|
|
msys_env: clang-x86_64-clang
|
|
shell: msys2 {0}
|
|
- name: Windows 11 Mingw-w64 Clang arm64
|
|
os: windows-11-arm
|
|
compiler: clang++
|
|
comp: clang
|
|
run_armv8_tests: true
|
|
msys_sys: clangarm64
|
|
msys_env: clang-aarch64-clang
|
|
shell: msys2 {0}
|
|
defaults:
|
|
run:
|
|
working-directory: src
|
|
shell: ${{ matrix.config.shell }}
|
|
steps:
|
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
with:
|
|
fetch-depth: 0
|
|
persist-credentials: false
|
|
|
|
- name: Download required linux packages
|
|
if: runner.os == 'Linux'
|
|
run: |
|
|
sudo apt update
|
|
sudo apt install expect valgrind g++-multilib qemu-user-static
|
|
|
|
- name: Install NDK
|
|
if: runner.os == 'Linux'
|
|
run: |
|
|
if [ $COMP == ndk ]; then
|
|
NDKV="27.2.12479018"
|
|
ANDROID_ROOT=/usr/local/lib/android
|
|
ANDROID_SDK_ROOT=$ANDROID_ROOT/sdk
|
|
SDKMANAGER=$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager
|
|
echo "y" | $SDKMANAGER "ndk;$NDKV"
|
|
ANDROID_NDK_ROOT=$ANDROID_SDK_ROOT/ndk/$NDKV
|
|
ANDROID_NDK_BIN=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin
|
|
echo "ANDROID_NDK_BIN=$ANDROID_NDK_BIN" >> $GITHUB_ENV
|
|
fi
|
|
|
|
- name: Set up QEMU
|
|
if: matrix.config.base_image
|
|
uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0
|
|
|
|
- name: Set up Docker Buildx
|
|
if: matrix.config.base_image
|
|
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
|
|
|
|
- name: Build Docker container
|
|
if: matrix.config.base_image
|
|
run: |
|
|
docker buildx build --platform ${{ matrix.config.platform }} --load -t sf_builder - << EOF
|
|
FROM ${{ matrix.config.base_image }}
|
|
WORKDIR /app
|
|
RUN apk update && apk add make g++
|
|
CMD ["sh", "src/script.sh"]
|
|
EOF
|
|
|
|
- name: Download required macOS packages
|
|
if: runner.os == 'macOS'
|
|
run: brew install coreutils
|
|
|
|
- name: Install GCC on macOS
|
|
if: runner.os == 'macOS' && matrix.config.comp == 'gcc'
|
|
run: |
|
|
brew install gcc@11 || true
|
|
g++-11 --version
|
|
|
|
- name: Setup msys and install required packages
|
|
if: runner.os == 'Windows'
|
|
uses: msys2/setup-msys2@e9898307ac31d1a803454791be09ab9973336e1c # v2.31.1
|
|
with:
|
|
msystem: ${{ matrix.config.msys_sys }}
|
|
install: mingw-w64-${{ matrix.config.msys_env }} make git expect
|
|
|
|
- name: Download the used network from the fishtest framework
|
|
run: make net
|
|
|
|
- name: Extract the bench number from the commit history
|
|
run: |
|
|
for hash in $(git rev-list -100 HEAD); do
|
|
benchref=$(git show -s $hash | tac | grep -m 1 -o -x '[[:space:]]*\b[Bb]ench[ :]\+[1-9][0-9]\{5,7\}\b[[:space:]]*' | sed 's/[^0-9]//g') && break || true
|
|
done
|
|
[[ -n "$benchref" ]] && echo "benchref=$benchref" >> $GITHUB_ENV && echo "From commit: $hash" && echo "Reference bench: $benchref" || echo "No bench found"
|
|
|
|
- name: Check compiler
|
|
run: |
|
|
if [ -z "${{ matrix.config.base_image }}" ]; then
|
|
if [ $COMP == ndk ]; then
|
|
export PATH=${{ env.ANDROID_NDK_BIN }}:$PATH
|
|
fi
|
|
$COMPCXX -v
|
|
else
|
|
echo "$COMPCXX -v" > script.sh
|
|
docker run --rm --platform ${{ matrix.config.platform }} -v ${{ github.workspace }}:/app sf_builder
|
|
fi
|
|
|
|
- name: Test help target
|
|
run: make help
|
|
|
|
- name: Check git
|
|
run: git --version
|
|
|
|
# x86-32 tests
|
|
|
|
- name: Test debug x86-32 build
|
|
if: matrix.config.run_32bit_tests
|
|
run: |
|
|
export CXXFLAGS="-Werror -D_GLIBCXX_DEBUG"
|
|
make clean
|
|
make -j4 ARCH=x86-32 optimize=no debug=yes build
|
|
../tests/signature.sh $benchref
|
|
|
|
- name: Test x86-32 build
|
|
if: matrix.config.run_32bit_tests
|
|
run: |
|
|
make clean
|
|
make -j4 ARCH=x86-32 build
|
|
../tests/signature.sh $benchref
|
|
|
|
- name: Test x86-32-sse41-popcnt build
|
|
if: matrix.config.run_32bit_tests
|
|
run: |
|
|
make clean
|
|
make -j4 ARCH=x86-32-sse41-popcnt build
|
|
../tests/signature.sh $benchref
|
|
|
|
- name: Test x86-32-sse2 build
|
|
if: matrix.config.run_32bit_tests
|
|
run: |
|
|
make clean
|
|
make -j4 ARCH=x86-32-sse2 build
|
|
../tests/signature.sh $benchref
|
|
|
|
- name: Test general-32 build
|
|
if: matrix.config.run_32bit_tests
|
|
run: |
|
|
make clean
|
|
make -j4 ARCH=general-32 build
|
|
../tests/signature.sh $benchref
|
|
|
|
# x86-64 tests
|
|
|
|
- name: Test debug x86-64-avx2 build
|
|
if: matrix.config.run_64bit_tests
|
|
run: |
|
|
export CXXFLAGS="-Werror -D_GLIBCXX_DEBUG"
|
|
make clean
|
|
make -j4 ARCH=x86-64-avx2 optimize=no debug=yes build
|
|
../tests/signature.sh $benchref
|
|
|
|
- name: Test x86-64-bmi2 build
|
|
if: matrix.config.run_64bit_tests
|
|
run: |
|
|
make clean
|
|
make -j4 ARCH=x86-64-bmi2 build
|
|
../tests/signature.sh $benchref
|
|
|
|
- name: Test x86-64-avx2 build
|
|
if: matrix.config.run_64bit_tests
|
|
run: |
|
|
make clean
|
|
make -j4 ARCH=x86-64-avx2 build
|
|
../tests/signature.sh $benchref
|
|
|
|
# Test a deprecated arch
|
|
- name: Test x86-64-modern build
|
|
if: matrix.config.run_64bit_tests
|
|
run: |
|
|
make clean
|
|
make -j4 ARCH=x86-64-modern build
|
|
../tests/signature.sh $benchref
|
|
|
|
- name: Test x86-64-sse41-popcnt build
|
|
if: matrix.config.run_64bit_tests
|
|
run: |
|
|
make clean
|
|
make -j4 ARCH=x86-64-sse41-popcnt build
|
|
../tests/signature.sh $benchref
|
|
|
|
- name: Test x86-64-ssse3 build
|
|
if: matrix.config.run_64bit_tests
|
|
run: |
|
|
make clean
|
|
make -j4 ARCH=x86-64-ssse3 build
|
|
../tests/signature.sh $benchref
|
|
|
|
- name: Test x86-64-sse3-popcnt build
|
|
if: matrix.config.run_64bit_tests
|
|
run: |
|
|
make clean
|
|
make -j4 ARCH=x86-64-sse3-popcnt build
|
|
../tests/signature.sh $benchref
|
|
|
|
- name: Test x86-64 build
|
|
if: matrix.config.run_64bit_tests
|
|
run: |
|
|
make clean
|
|
make -j4 ARCH=x86-64 build
|
|
../tests/signature.sh $benchref
|
|
|
|
- name: Test general-64 build
|
|
if: matrix.config.run_64bit_tests
|
|
run: |
|
|
make clean
|
|
make -j4 ARCH=general-64 build
|
|
../tests/signature.sh $benchref
|
|
|
|
- name: Test apple-silicon build
|
|
if: matrix.config.run_m1_tests
|
|
run: |
|
|
make clean
|
|
make -j4 ARCH=apple-silicon build
|
|
../tests/signature.sh $benchref
|
|
|
|
- name: Test apple-silicon build with system g++ (macOS g++ == clang++)
|
|
if: matrix.config.run_m1_tests
|
|
run: |
|
|
make clean
|
|
env -u COMPCXX make -j4 ARCH=apple-silicon build COMP=gcc
|
|
../tests/signature.sh $benchref
|
|
|
|
# armv8 tests
|
|
|
|
- name: Test armv8 build
|
|
if: matrix.config.run_armv8_tests
|
|
run: |
|
|
if [ $COMP == ndk ]; then
|
|
export PATH=${{ env.ANDROID_NDK_BIN }}:$PATH
|
|
export LDFLAGS="-static -Wno-unused-command-line-argument"
|
|
fi
|
|
make clean
|
|
make -j4 ARCH=armv8 build
|
|
../tests/signature.sh $benchref
|
|
|
|
- name: Test armv8-dotprod build
|
|
if: matrix.config.run_armv8_tests
|
|
run: |
|
|
if [ $COMP == ndk ]; then
|
|
export PATH=${{ env.ANDROID_NDK_BIN }}:$PATH
|
|
export LDFLAGS="-static -Wno-unused-command-line-argument"
|
|
fi
|
|
make clean
|
|
make -j4 ARCH=armv8-dotprod build
|
|
../tests/signature.sh $benchref
|
|
|
|
# armv7 tests
|
|
|
|
- name: Test armv7 build
|
|
if: matrix.config.run_armv7_tests
|
|
run: |
|
|
export PATH=${{ env.ANDROID_NDK_BIN }}:$PATH
|
|
export LDFLAGS="-static -Wno-unused-command-line-argument"
|
|
make clean
|
|
make -j4 ARCH=armv7 build
|
|
../tests/signature.sh $benchref
|
|
|
|
- name: Test armv7-neon build
|
|
if: matrix.config.run_armv7_tests
|
|
run: |
|
|
export PATH=${{ env.ANDROID_NDK_BIN }}:$PATH
|
|
export LDFLAGS="-static -Wno-unused-command-line-argument"
|
|
make clean
|
|
make -j4 ARCH=armv7-neon build
|
|
../tests/signature.sh $benchref
|
|
|
|
# ppc64 tests
|
|
|
|
- name: Test ppc64 build
|
|
if: matrix.config.run_ppc64_tests
|
|
run: |
|
|
echo "cd src && export LDFLAGS='-static' && make clean && make -j4 ARCH=ppc-64 build" > script.sh
|
|
docker run --rm --platform ${{ matrix.config.platform }} -v ${{ github.workspace }}:/app sf_builder
|
|
../tests/signature.sh $benchref
|
|
|
|
# loongarch64 tests
|
|
|
|
- name: Test loongarch64 build
|
|
if: matrix.config.run_loongarch64_tests
|
|
run: |
|
|
echo "cd src && export LDFLAGS='-static' && make clean && make -j4 ARCH=loongarch64 build" > script.sh
|
|
docker run --rm --platform ${{ matrix.config.platform }} -v ${{ github.workspace }}:/app sf_builder
|
|
../tests/signature.sh $benchref
|
|
|
|
- name: Test loongarch64-lsx build
|
|
if: matrix.config.run_loongarch64_tests
|
|
run: |
|
|
echo "cd src && export LDFLAGS='-static' && make clean && make -j4 ARCH=loongarch64-lsx build" > script.sh
|
|
docker run --rm --platform ${{ matrix.config.platform }} -v ${{ github.workspace }}:/app sf_builder
|
|
../tests/signature.sh $benchref
|
|
|
|
- name: Test loongarch64-lasx build
|
|
if: matrix.config.run_loongarch64_tests
|
|
run: |
|
|
echo "cd src && export LDFLAGS='-static' && make clean && make -j4 ARCH=loongarch64-lasx build" > script.sh
|
|
docker run --rm --platform ${{ matrix.config.platform }} -v ${{ github.workspace }}:/app sf_builder
|
|
../tests/signature.sh $benchref
|
|
|
|
# Other tests
|
|
|
|
- name: Check perft and search reproducibility
|
|
if: matrix.config.run_64bit_tests
|
|
run: |
|
|
make clean
|
|
make -j4 ARCH=x86-64-avx2 build
|
|
../tests/perft.sh
|
|
../tests/reprosearch.sh
|