微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将 Stockfish 13 从 Windows 10 交叉编译到 armv8?

如何解决如何将 Stockfish 13 从 Windows 10 交叉编译到 armv8?

Stockfish 13 于 2021 年 2 月 19 日发布,是我写这些行时最强大的国际象棋引擎。您可以为 windows、linux、mac os 和 android 下载它。然而,在我写这些行的时候,android 二进制文件下载链接指向 Stockfish 12 而不是 13。(这在 Stockfish 中经常发生,因为 android 二进制文件不是人们最需要的。)因为 Stockfish 是开源的( github here),我们如何在 Windows 10 计算机上为 Android 手机交叉编译 Stockfish 13? (就我而言,是运行 Android 11 的三星 galaxy S21 Ultra。)

解决方法

我们将需要源代码:git clone https://github.com/official-stockfish/Stockfish.git(请参阅 Stockfish 的 github 上的正确地址,因为此地址可能会更改)位于您 PC 上的某个位置。 (例如,您需要 Tortois Git 的命令行实用程序。)让我们将 PC 上的 StockFish 文件夹(包含 StockFishDIr 作为子文件夹)的完整路径称为 src

我们还需要一个交叉编译器来......交叉编译(!)将 PC 上的源代码转换为针对 Android 操作系统的可执行文件,这意味着:在 ANdroid 操作系统上可执行,即在电话上。我们将使用 Android-NDK,它包含工具链和交叉编译器。我们下载“最新稳定版本”r22(截至我写这些行的那一刻)并将其解压缩到 PC 上的一个文件夹中;我将“AndroidNdkDir”称为 PC 上此目录的完整路径(包含 buildmetaprebuilttoolchains 等文件夹)。

最后,由于在 Stockfish 的源代码中只有一个 Makefile,我们将需要在 windows 下使用 make。是的。只需从 GnuWin32 获取它并注意 MakeDir 您PC 上的安装目录,该目录包含包含 binmake.exe 文件夹。对 MakeFile 进行线性分析表明,如果下载了某个文件,交叉编译可以归结为仅一个命令行,以及另一个“优化”命令行。

现在我们看看 MakeFile 中的 StockFishDIr\src ;我们会稍微修改一下。

首先我们通过更改行来更改可执行文件名称

EXE = stockfish

进入

EXE = stockfish_13_armv8_xcomp_win10x64

给它一个有意义的名字。

其次,我们定位armv8的出现(它是三星Galaxy S21 Ultra的ARCH;如果您有另一部Android手机,也许您应该寻找'armv7'并因此适应什么如下)关于编译器:即,我们替换位

    ifeq ($(arch),armv8)
        CXX=aarch64-linux-android21-clang++
        STRIP=aarch64-linux-android-strip
    endif

    ifeq ($(arch),armv8)
        CXX=AndroidNdkDir\toolchains\llvm\prebuilt\windows-x86_64\bin\aarch64-linux-android30-clang++.cmd
        STRIP=AndroidNdkDir\toolchains\llvm\prebuilt\windows-x86_64\bin\aarch64-linux-android-strip.exe
endif
    endif

(请注意,CXX 行中最初的 android21 被我替换为 android30。这是因为三星 Galaxy s21 Ultra 运行的是 Android 11,其真实版本号为 android30。如果您有带有另一个安卓版本的安卓手机,因此调整线路。)

现在,在编译之前,我们需要最后一部分:net 文件(技术上,net = 网络 = 神经网络 = Stockfish 操作的神经网络的权重文件)。 “通常”(啊啊),在 linux 设置下(我在这里所做的所有工作几乎mutatis mutandis 在 Linux 上),我们只会做一个 "MakeDir\bin\make.exe" profile-build ARCH=x86-64 来下载 net 文件,需要,我们甚至不会打扰我们。遗憾的是,由于某些原因,在这里运行 "MakeDir\bin\make.exe" profile-build ARCH=x86-64 不起作用,我们需要自己手动下载 net 文件。因此,我们必须查看 Makefile 以查找 net 文件是如何下载的。 Makefile 中重要的一点是:

# evaluation network (nnue)
net:
    $(eval nnuenet := $(shell grep EvalFileDefaultName evaluate.h | grep define | sed 's/.*\(nn-[a-z0-9]\{12\}.nnue\).*/\1/'))
    @echo "Default net: $(nnuenet)"
    $(eval nnuedownloadurl := https://tests.stockfishchess.org/api/nn/$(nnuenet))
    $(eval curl_or_wget := $(shell if hash curl 2>/dev/null; then echo "curl -skL"; elif hash wget 2>/dev/null; then echo "wget -qO-"; fi))
    @if test -f "$(nnuenet)"; then \
            echo "Already available."; \
        else \
            if [ "x$(curl_or_wget)" = "x" ]; then \
            echo "Automatic download failed: neither curl nor wget is installed. Install one of these tools or download the net manually"; exit 1; \
            else \
            echo "Downloading $(nnuedownloadurl)"; $(curl_or_wget) $(nnuedownloadurl) > $(nnuenet);\
            fi; \
        fi;
    $(eval shasum_command := $(shell if hash shasum 2>/dev/null; then echo "shasum -a 256 "; elif hash sha256sum 2>/dev/null; then echo "sha256sum "; fi))
    @if [ "x$(shasum_command)" != "x" ]; then \
        if [ "$(nnuenet)" != "nn-"`$(shasum_command) $(nnuenet) | cut -c1-12`".nnue" ]; then \
                echo "Failed download or $(nnuenet) corrupted,please delete!"; exit 1; \
            fi \
        else \
            echo "shasum / sha256sum not found,skipping net validation"; \
        fi

我们看到文件的地址是https://tests.stockfishchess.org/api/nn/$(nnuenet)),变量nnuenet是通过在头文件{{1}中grep对字符串EvalFileDefaultName进行evaluate.h定义的} (在 StockFishDIr\src 内),感兴趣的线是:

#define EvalFileDefaultName   "nn-62ef826d1a6d.nnue"

因此变量 nnuenet 等于字符串“nn-62ef826d1a6d.nnue”,我们要手动下载网络的地址是 https://tests.stockfishchess.org/api/nn/nn-62ef826d1a6d.nnue

当然,这个地址将来可能会改变,但你看到了这个想法。现在我们将网络文件放在 StockFishDIr\src

现在我们准备交叉编译,在 StockFishDIr\src 中执行以下命令:

"MakeDir\bin\make.exe" stockfish_13_armv8_xcomp_win10x64 COMP=ndk COMPCC="AndroidNdkDir\toolchains\llvm\prebuilt\windows-x86_64\bin\aarch64-linux-android30-clang --target=aarch64-linux-android30" ARCH=armv8

(此处还根据您的 Android 手机调整 aarch64-linux-android30 位。)

当前面的命令正确执行时,它会在 stockfish_13_armv8_xcomp_win10x64 文件夹中生成 StockFishDIr\src 二进制文件。这个二进制文件已经可以在你的手机上使用(例如,把它放在你的 DroidFish 应用程序的 DroidFish\uci 文件夹中),但不是最佳的,因为它的大小很大而且执行速度有点慢。因此,我们必须使用以下命令行“剥离”二进制文件,仍在 StockFishDIr\src 文件夹中:

"AndroidNdkDir\toolchains\llvm\prebuilt\windows-x86_64\bin\aarch64-linux-android-strip" stockfish_13_armv8_xcomp_win10x64

(不再有 android30 但仍然有 aarch64 :根据您的 Android 手机在这里也调整 aarch64-linux-android30 位。)

现在,您的二进制文件 stockfish_13_armv8_xcomp_win10x64 完全可用。您可以在手机上与 StockFish 13 下棋,并受苦! ;)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。