slime/show/BENCHMARK.md

7.3 KiB
Raw Blame History

show:逐步实现与本次实测

测量时间:2026-10-08T00:28:41.318982+08:00(Asia/Hong_Kong)。所有表格由 benchmark.py 自动生成。 CPU:AMD Ryzen 7 5800H,WSL,16 个逻辑线程。GPU 型号见下面逐项输出;编译器、驱动、源码 SHA256 和全部样本保存在 results/latest.json。

1. 分段对比:相邻版本在同一负载下测试

主线分成 A、B、C 三组,横线表示更换测试负载。分界两边重复测量衔接版本:A/B 都有 02,B/C 都有 03;只在组内计算速度比。展平实现已移到 experiments,不属于这个阶段。 原来只有 64 个 seed 的极端负载移到 results/mapping_diagnostics.json,用于解释并行度,不再作为主线 02→03 的优化倍数。 GPU 各对照版本核对完整 (seed,x,z) 命中列表;所有 GPU 命中另由独立 Python Java 算术核验。A/C 与完整 CPU 扫描核对,B 的独立 CPU 验证采用明确列出的窗口。每个版本先跑实际工作量预热,GPU 测量顺序轮换。 CPU 计时包含线程创建、搜索与结果收集;GPU kernel 时间用 CUDA event,scan 时间另含清零、同步与结果回传。两者均不含结果排序,GPU scan 不含一次性的上下文创建及内存分配。 A 的 01→02 用 CPU 搜索时间和 GPU scan 时间比较;B/C 的相邻 CUDA 版本用 kernel 时间比较。B/C 的 CPU 仅用于正确性验证,不列入性能表。

线程映射分段改测时间:2026-10-08T23:15:42.590910+08:00。后面的算法实验沿用上方日期的实测数据,分段实验测量时的源码 SHA256 记录在 metadata.mapping_source_sha256,C 单独复测的源码记录在 metadata.C_source_sha256。

C 组复测时间:2026-10-08T23:58:18.383398+08:00,100 轮轮换测量。

A:CPU → 按 seed 的 CUDA

seed=61692151016558 起共 65,536 个 seed,257×257 个锚点,实心 5×5。候选总数 4,328,587,264。 GPU:NVIDIA GeForce RTX 3060 Laptop GPU。结果完全一致,命中 1 个元组;每版完整预热一次,计时 5 轮。

版本 CPU 搜索/GPU kernel 中位数 GPU scan 中位数
01 CPU 3550.398 ms —
02 CUDA/每个 thread 一个 seed 102.147 ms 111.110 ms
相邻/分支对照 同口径速度比(前项时间/后项时间)
01 → 02(CPU 搜索/GPU scan) 31.954×

65536 个 seed 为版本 02 提供足够的独立线程,在 257×257 的完整地图上测量 CPU→CUDA。


测试负载分界:下一组重新测量衔接版本,不跨横线计算加速比。

B:大坐标范围的固定坐标策略

seed=61692151016558 起共 65,536 个 seed,4097×4097 个锚点,实心 5×5。候选总数 1,100,048,564,224。 GPU:NVIDIA GeForce RTX 3060 Laptop GPU。结果完全一致,命中 1 个元组;每版完整预热一次,计时 5 轮。

版本 CPU 搜索/GPU kernel 中位数 GPU scan 中位数
02 CUDA/每个 thread 一个 seed 31598.539 ms 34152.855 ms
03 CUDA/固定坐标,复用多项式后遍历 seed 17600.387 ms 19014.153 ms
相邻/分支对照 同口径速度比(前项时间/后项时间)
02 → 03(GPU kernel) 1.795×

本组使用 65536 个 seed,坐标范围扩大到 4097×4097(16785409 个坐标任务)。02/03 都完整扫描相同的笛卡尔积,GPU 命中列表完全一致。 独立 CPU 核对全部 65536 个 seed 在 [50941,51197] × [418996,419252] 的 257×257 窗口;这是窗口验证,不是完整大范围 CPU 重扫。所有 GPU 命中均另作独立精确算术验证。


测试负载分界:下一组重新测量衔接版本,不跨横线计算加速比。

C:固定 seed 的坐标扫描与 outer sum

seed=61692151016558 起共 1 个 seed,8193×8193 个锚点,实心 5×5。候选总数 67,125,249。 GPU:NVIDIA GeForce RTX 3060 Laptop GPU。结果完全一致,命中 1 个元组;每版完整预热一次,计时 100 轮。

版本 CPU 搜索/GPU kernel 中位数 GPU scan 中位数
03 CUDA/固定坐标,复用多项式后遍历 seed 2.715 ms 3.127 ms
04 CUDA/tiled outer sum 1.598 ms 1.913 ms
相邻/分支对照 同口径速度比(前项时间/后项时间)
03 → 04(GPU kernel) 1.698×

本组改为固定 seed,重新测量 03 后再比较 04。03、04 均保持固定坐标后遍历 seed 的策略。

随机数性质的探索独立成章,见 RANDOM_PROPERTIES.md。从状态空间、低位依赖和模运算约束推导搜索方法,不列为局部计时优化。

2. 固定 seed:全坐标范围余数过滤

固定 seed 61692151016558;两轴锚点范围 [-1875000,1874999],总计 14,062,500,000,000 个位置。 完整扫描 2^36 个余数对,保留 180,476 个,展开 36,937,048 个候选,得到 (51069,419124)。

时间区域 中位数
余数 GPU kernel(实测) 2.967 s
表准备+kernel+CPU 精查(实测) 3.622 s
独立进程全流程(实测) 3.939 s
按 8193×8193 直接扫描吞吐外推全范围 568.7 s

外推直接 kernel 相对余数实测计算流程约 157.0×。分母包含余数方法的准备和 CPU 精查;没有声称实际跑完直接全范围搜索。 07 沿用 research 的首次输出候选模型,尚未覆盖 Java 拒绝尾部例外。锚点范围允许图案向外延伸四格。

3. 固定坐标:seed 搜索

锚点 (51069,419124)、实心 5×5。CPU/CUDA 解析流程均恢复同一组 24 个已知 seed。

版本 实测规模 搜索/kernel 中位数 进程全流程中位数 完整 2^48 外推
brute_cpu 2^28 seed 174.542 ms 181.317 ms 183020.0 s
brute_cuda 2^34 seed 386.768 ms 777.132 ms 6336.8 s
solver_cpu 全部 lower35 候选+upper13 解析 1013.310 ms 1022.607 ms —
solver_cuda 全部 lower35 候选+upper13 解析 80.108 ms 446.468 ms —

同 GPU 算法比值:暴力完整空间外推/解析 kernel 约 79,104×。 solver_cpu 的程序内 seconds 计时从通过筛选的低 18 位取值 生成之后开始;进程全流程覆盖全部准备。CUDA 的 milliseconds 为 kernel 时间。 解析流程是首次输出候选模型,不是含全部拒绝尾部分支的严格穷尽。

高 13 位优化的受控拆解

相同的 65536 个连续 lower35 平面,从 16420645998 开始。枚举与解析都使用首次输出候选模型,并准确验证最终候选。 这里的 lower35 指世界种子的低 35 位。

高位策略 kernel 中位数
enumerate_upper13 8.793 ms
analytic_upper13 0.087 ms

完整候选结果相同。局部解析加速 101.024×,只适用于这组供给的 lower35 平面。

复现与边界

make -C show -j4
python3 show/test_steps.py --gpu
python3 show/benchmark.py --repeats 5

GPU 运行需要宿主 GPU 可用。计时期间 GPU 同时承担桌面工作,时钟、温度和系统负载会影响数字;全部原始样本可检查波动。 01–04 精确覆盖被请求的有限输入范围。07/08 的生成器保留研究原型的拒绝尾部覆盖限制;全 seed × 全世界联合生成仍未实现。 本报告不把“潜在笛卡尔积大小”当作实际访问次数,也不把局部加速比连乘。