XMRig GhostRider(Raptoreum)挖矿实战:自动调优原理、线程配置与源码级解析
【免费下载链接】xmrigRandomX, KawPow, CryptoNight and GhostRider unified CPU/GPU miner and RandomX benchmark项目地址: https://gitcode.com/GitHub_Trending/xm/xmrig
本篇技术指南围绕 XMRig 对 GhostRider 算法(Raptoreum 链)的原生支持展开,覆盖从 v6.16.0 引入的算法支持、命令行与批处理模板的快速接入、线程配置的正确姿势,到"免调优自动配置"背后的性能原理与底层实现。读完本文,你将掌握如何在 XMRig 中正确启动 GhostRider 挖矿、理解其独特的"一个哈希批次由多线程协同计算"的调度模型,并能从源码层面定位相关实现路径。
GhostRider 算法与 XMRig 的支持方式
GhostRider 是 Raptoreum(RTM)采用的 PoW 算法,属于一种混合型算法:它由15 个经典哈希函数(Blake、BMW、Groestl、JH、Keccak、Skein、Luffa、Cubehash、Shavite、SIMD、Echo、Hamsi、Fugue、Shabal、Whirlpool)与6 个 Cryptonight 变体组合而成。XMRig 从v6.16.0版本开始原生支持该算法,无需任何外部依赖或插件。
在源码中,该算法被定义为GHOSTRIDER_RTM(别名ghostrider、ghostrider/rtm、gr),其内部使用的 6 个 Cryptonight 变体依次对应 Algorithm.h 中的枚举值:
| 枚举 | 字符串名称 | 内存大小 | 说明 |
|---|---|---|---|
CN_GR_0 | cn/dark | 512 KB | GhostRider 专用变体 |
CN_GR_1 | cn/dark-lite | 256 KB | GhostRider 专用变体 |
CN_GR_2 | cn/fast | 2 MB | GhostRider 专用变体 |
CN_GR_3 | cn/lite | 1 MB | GhostRider 专用变体 |
CN_GR_4 | cn/turtle | 256 KB | GhostRider 专用变体 |
CN_GR_5 | cn/turtle-lite | 128 KB | GhostRider 专用变体 |
以上内存大小对应 ghostrider.cpp 中的cn_sizes数组注释。在 CnAlgo.h 中还可以看到每个变体的迭代次数特化(CN_ITER / 4、CN_ITER / 2、CN_ITER / 8)以及cn/dark-lite、cn/turtle-lite的特殊掩码,这些细节决定了各变体在单次计算中的工作量差异。
从构建角度看,GhostRider 是一个可选的独立模块:CMake 通过WITH_GHOSTRIDER选项控制是否编译,开启后会定义XMRIG_ALGO_GHOSTRIDER宏并构建静态库ghostrider(见 cmake/ghostrider.cmake),其模块级 CMake 配置位于 src/crypto/ghostrider/CMakeLists.txt,其中对全部sph_*哈希源文件使用-Os(MSVC 下为/O1 /Oi /Os)编译,以控制二进制体积与缓存友好度。
快速上手:命令行与批处理模板
GhostRider 的启动方式与 XMRig 其他算法一致,只需要在命令行指定-a gr。官方 README(src/crypto/ghostrider/README.md)给出了两种典型场景的示例。
非 SSL 端口示例:
xmrig -a gr -o raptoreumemporium.com:3008 -u WALLET_ADDRESS -p xSSL 端口示例:
xmrig -a gr -o rtm.suprnova.cc:4273 --tls -u WALLET_ADDRESS -p x两者的区别仅在于池端口与是否追加--tls参数。字段含义为:
-a gr:指定使用 GhostRider 算法(等价于--algo=ghostrider);-o <host>:<port>:矿池的 stratum 地址与端口;-u <wallet>:矿池用户名,对大多数 Raptoreum 矿池而言就是你的 RTM 钱包地址;-p x:矿池密码,多数矿池填写x即可。
仓库同时提供了开箱即用的 Windows 批处理模板 scripts/rtm_ghostrider_example.cmd,其核心命令与 README 完全一致:
xmrig.exe -a gr -o raptoreumemporium.com:3008 -u WALLET_ADDRESS -p x该脚本还包含一段注释,说明了pool address、pool port、pool username/wallet、pool password四个字段的填写规则,并建议选择排名靠后的矿池以帮助 Raptoreum 网络去中心化。实际使用时,只需把WALLET_ADDRESS替换为你自己的地址即可。
线程配置:为什么官方不建议使用 --threads
README 明确给出了一条重要建议:不要使用--threads(-t)参数,因为它会关闭 XMRig 内置的高级自动配置逻辑。如果你确实想调整 GhostRider 的线程数量,官方推荐的命令行方式是:
--cpu-max-threads-hint=N其中N的取值范围是0 到 100,表示 CPU 线程使用率上限的百分比。例如设置--cpu-max-threads-hint=75即让自动配置最多使用约 75% 的可用线程。在源码中,该选项对应的配置键为max-threads-hint(见 CpuConfig.cpp),在config.json里位于"cpu"段下,与命令行等价。
如果需要进行更精细的线程规划(例如按 NUMA 节点或物理核心数精确控制),建议改用 config.json 而不是命令行,通过"cpu"段的threads配置手工指定线程拓扑——这样可以在保留自动调优结果的基础上做局部微调。
性能原理:自动配置与细粒度线程调度
GhostRider 的性能亮点在于其独特的调度模型。README 指出:尽管单个算法的实现并未做极致优化,XMRig 通过更好的自动配置与更细粒度的线程调度获得了更高的综合算力——核心思路是:对缓存需求不大的计算部分,可以用 2 个线程协同计算同一个哈希批次。
以典型的 Intel CPU(每个核心 2 MB 缓存)为例:cn/fast(2 MB 内存)需要完整占用核心缓存,因此每个核心只运行 1 个线程;而其他更小的 Cryptonight 变体(如 512 KB、256 KB、128 KB)缓存需求低,可以在同一批次中让每个核心运行 2 个线程分担计算,从而始终把 CPU 负载维持在 50% 以上。反过来,在 Ryzen 3000/5000 系列 CPU 上,如果系统检测到某些变体"每核心 1 线程"反而更快,XMRig 也允许 CPU 负载略低于 100%——这正是自动调优根据实测数据做出的取舍。
这一机制的源码实现集中在 ghostrider.cpp:
- helper 线程(HelperThread):
create_helper_thread()通过 hwloc 在物理核心的剩余逻辑线程上创建辅助线程(ghostrider.cpp),主线程与辅助线程通过uv_mutex/uv_cond完成任务投递与同步(ghostrider.cpp)。 - 运行时决策:
hash_octa()每次计算 8 个哈希(N = 8)。当三个 Cryptonight 变体在调优表中都被标记为threads == 2时,会把 8 个哈希拆成前 4 个 + 后 4 个,分别交给主线程和 helper 线程并行计算(ghostrider.cpp);否则退化为单线程逐部分计算。 - 自动调优:
benchmark()会在挖矿前对不同变体、不同 step(1/2/4)组合进行实测,维护tuneDefault与tune8MB两张调优表,并依据 CPU 的 L3 缓存容量(每核心是否达到 8 MB)选择最优参数(ghostrider.cpp)。这解释了 README 中"无需手动调优"的结论——调优动作在启动时已由程序自动完成。
调用链的入口位于 CpuWorker.cpp(创建 helper 线程)与 CpuWorker.cpp(对 GHOSTRIDER 家族算法调用ghostrider::hash_octa),接口声明见 ghostrider.h。
哈希流水线:15 个核心哈希与 6 个 CN 变体的组合
了解调度之外,GhostRider 的哈希构造也值得拆解。hash_octa()的流程如下(ghostrider.cpp):
- 选取算法组合:从 Blob 中
[4; 36)字节(即 PrevBlockHash,GhostRider 的种子)逐 nibble 采样,通过select_indices()无重复地选出 15 个核心哈希索引(core_indices[15])与 6 个 CN 变体索引(cn_indices[6])。 - 三段流水线:整批计算被分为 3 个 part,每个 part 依次执行5 个核心哈希 + 1 个 Cryptonight 变体——前一轮的输出(32 字节哈希 + 32 字节零填充)作为下一轮的输入,形成 64 字节的中间缓冲
tmp[64 * N]。 - 输出:最终得到每个输入的 32 字节结果,写入
output。
15 个核心哈希函数由宏CORE_HASH批量生成(ghostrider.cpp),包括blake512、bmw512、groestl512、jh512、keccak512、skein512、luffa512、cubehash512、shavite512、simd512、echo512、hamsi512、fugue512、shabal512、whirlpool,对应源码目录下对应的sph_*.c/sph_*.h文件。由于每个 part 的 CN 变体由种子动态决定,同一批 8 个哈希可能混用不同内存大小的 scratchpad,hash_octa()会按step参数重新分配ctx内存区(见 ghostrider.cpp),这也是"细粒度调度"能够生效的物理前提。
需要说明的是,在未启用 hwloc(XMRIG_FEATURE_HWLOC)或 ARM/RISC-V 平台上,benchmark()与 helper 线程相关接口会退化为空实现,hash_octa()使用固定的 step 数组{4, 4, 1, 2, 4, 4}以单线程方式执行(ghostrider.cpp),此时将无法获得 x86 平台上的多线程协同加速。
性能测试数据
README 中附带了作者实测的性能对比表。以下为Windows 平台(XMRig v6.16.2 MSVC 构建 vs cpuminer-gr-avx2 1.2.4.1 调优版)的对比结果:
| CPU | cpuminer-gr-avx2(调优后), h/s | XMRig v6.16.2(MSVC), h/s | 提速 |
|---|---|---|---|
| AMD Ryzen 7 4700U | 632.6 | 733.1 | +15.89% |
| Intel Core i7-2600 | 496.4 | 554.6 | +11.72% |
| AMD Ryzen 7 3700X @ 4.1 GHz | 2453.0 | 2496.5 | +1.77% |
| AMD Ryzen 5 5600X @ 4.65 GHz | 2112.6 | 2337.5 | +10.65% |
此外还有一组Linux 平台数据(XMRig v6.16.0 GCC 构建,由社区成员 Delgon 测试),README 已明确标注该组数据过时,仅供参考:
| CPU | cpuminer-gr-avx2(调优后), h/s | XMRig v6.16.0(GCC), h/s | 提速 |
|---|---|---|---|
| AMD Ryzen 9 3900X | 3746.51 | 3604.89 | -3.78% |
| 2x Intel Xeon E5-2698v3 | 2563.4 | 2638.38 | +2.925% |
从数据可见,XMRig 在中小缓存 CPU 上的优势尤其明显(如 Ryzen 7 4700U 与 Core i7-2600 均超过 11%),这与前述"2 线程协同计算低缓存变体"的调度策略直接相关。需要强调的是,这些数字是特定版本、特定 CPU 上的历史实测值,实际算力会随 CPU 型号、编译选项(MSVC/GCC/Clang)、内存与散热环境而变化,请以你本机的实测结果为准。
相关源码索引
如需深入阅读,可按以下路径继续探索:
- 算法定义与别名:src/base/crypto/Algorithm.h、src/base/crypto/Algorithm.cpp
- Cryptonight 变体参数特化:src/crypto/cn/CnAlgo.h
- GhostRider 核心实现与自动调优:src/crypto/ghostrider/ghostrider.cpp、src/crypto/ghostrider/ghostrider.h
- 15 个核心哈希源码:src/crypto/ghostrider/ 下的
sph_*.c/sph_*.h - 模块构建开关:cmake/ghostrider.cmake、src/crypto/ghostrider/CMakeLists.txt
- 工作线程调用入口:src/backend/cpu/CpuWorker.cpp
- 启动模板:scripts/rtm_ghostrider_example.cmd
- 官方说明:src/crypto/ghostrider/README.md
【免费下载链接】xmrigRandomX, KawPow, CryptoNight and GhostRider unified CPU/GPU miner and RandomX benchmark项目地址: https://gitcode.com/GitHub_Trending/xm/xmrig
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考