cuGenOpt/benchmark/experiments/e9_multi_gpu_b3
2026-03-20 00:33:45 +08:00
..
README.md Initial commit: cuGenOpt GPU optimization solver 2026-03-20 00:33:45 +08:00

E9: Multi-GPU B3 方案验证

实验目的

验证 Multi-GPU v5.0 方案 B3被动注入在运行期间进行解交换的有效性对比简化版独立运行 + 最终比较)。

实验设计

对比方案

  1. 简化版Baseline: 在单 GPU 上运行多次独立 solve(),每次使用不同种子,最后选择最优解
  2. B3 保守策略: interval=3s, MultiGpuInjectMode::OneIslandHalfIslands
  3. B3 激进策略: interval=1s, MultiGpuInjectMode::AllIslands

测试问题

问题 规模 说明
TSP n=50 小规模基准测试
TSP n=64 最大支持规模(受 Solution<1,64> 限制)
VRP n=40 中等规模约束问题
VRP n=50 较大规模约束问题(遇到内存错误)

配置参数

SolverConfig cfg;
cfg.pop_size = 1024;
cfg.max_gen = 10000;
cfg.num_islands = 16;
cfg.use_aos = true;
cfg.sa_temp_init = 50.0f;
cfg.use_cuda_graph = true;
cfg.num_gpus = 2;  // B3 方案

运行环境

  • GPU: 2×V100S (16GB)
  • CUDA: 12.8
  • 运行次数: 每个配置 5-10 次取平均

实验结果

小规模问题TSP n=50, VRP n=40

问题 简化版 B3 保守 B3 激进 改进(保守) 改进(激进)
TSP n=50 712.76 712.83 712.78 -0.01% -0.00%
VRP n=40 786.00 786.00 786.53 0.00% -0.07%

运行次数: 10 次平均

大规模问题TSP n=64

问题 简化版 B3 激进 改进
TSP n=64 825.37 825.27 +0.01%

运行次数: 8 次平均

详细数据TSP n=64, 8 runs

简化版

Run 1: 830.20
Run 2: 824.20
Run 3: 825.40
Run 4: 825.00
Run 5: 823.60
Run 6: 824.40
Run 7: 823.10
Run 8: 827.10
平均: 825.37

B3 激进interval=1s, AllIslands

Run 1: 830.80
Run 2: 828.80
Run 3: 821.00
Run 4: 824.10
Run 5: 823.20
Run 6: 825.10
Run 7: 822.00
Run 8: 827.20
平均: 825.27

结论

主要发现

  1. B3 方案未带来显著收益: 在所有测试规模上B3运行期间解交换相比简化版独立运行的改进均在 ±0.1% 范围内,属于统计噪声
  2. 问题规模影响不大: 从小规模n=50到大规模n=64B3 的相对表现没有明显变化
  3. 注入策略影响微弱: 保守策略3s, OneIsland和激进策略1s, AllIslands的效果差异不明显

技术分析

为什么 B3 没有效果?

  1. 搜索空间特性: 元启发式算法的搜索轨迹高度依赖初始解和随机种子,不同 GPU 的搜索轨迹本质上是相互独立的
  2. 解的多样性不足: 不同 GPU 找到的最优解往往处于相似的局部最优区域,注入到其他 GPU 后无法带来新的搜索方向
  3. 注入时机问题: 在搜索中期注入外部解可能破坏已有的搜索动量,反而降低收敛效率
  4. 岛屿模型已足够: 单 GPU 内部的 16 个岛屿已经提供了足够的种群多样性

与行业实践一致

  • cuOpt: NVIDIA 官方组合优化求解器不支持多 GPU
  • OR-Tools: Google 的求解器不支持多 GPU
  • Gurobi/CPLEX: 商业 MIP 求解器的多 GPU 支持仅限于特定算法(如 Barrier

这些商业求解器的选择说明:对于组合优化问题,多 GPU 的投入产出比很低

规模限制

当前测试受到以下限制:

  1. 编码维度: TSPProblemD2=64 限制了最大问题规模为 n=64
  2. VRP 内存错误: VRP n≥50 时出现 illegal memory access,可能是 VRP 编码的内存布局问题
  3. GPU 资源: 仅有 2×V100S 可用,无法测试 4 GPU 的效果

用户观点: "本质还是我们的规模太小了GPU 解决的 TSP 应该是千级别的"——这是合理的观察。真正需要多 GPU 协同的问题规模应该在 n>1000但当前框架的编码限制固定维度数组无法支持。

下一步建议

短期(暂缓)

  • 标记为探索性功能: 将 B3 方案标记为"技术可行但效果不明显",不作为主要卖点
  • 保留代码: B3 的实现(InjectBuffer, inject_check_kernel, coordinator_thread)技术上是正确的,可以保留作为框架能力展示

长期(如需要)

  • 突破编码限制: 实现动态维度编码(如 std::vector 或 GPU 端动态分配),支持 n>1000 的超大规模问题
  • 重新评估: 在千级规模上重新测试 B3 方案,此时多 GPU 的价值可能显现
  • 探索其他多 GPU 模式: 如问题分解Domain Decomposition而非解交换

文件清单

实验代码(远程 gpu2v100

  • ~/cugenopt_b3/test_b3_benchmark.cu: 初始 B3 vs 1-GPU 对比TSP n=50, VRP n=40
  • ~/cugenopt_b3/test_b3_vs_simplified.cu: B3 vs 简化版直接对比TSP n=50, VRP n=40
  • ~/cugenopt_b3/test_b3_aggressive.cu: 激进策略测试3 种策略对比)
  • ~/cugenopt_b3/test_b3_final.cu: 大规模测试TSP n=64, VRP n=50

核心实现

  • prototype/core/types.cuh: InjectBuffer 结构定义
  • prototype/core/solver.cuh: inject_check_kernel 实现
  • prototype/core/multi_gpu_solver.cuh: coordinator_threadsolve_multi_gpu 实现

设计文档

  • MULTI_GPU_EXCHANGE_DESIGN.md: 完整的方案设计和技术分析
  • MULTI_GPU_INDUSTRY_PATTERNS.md: 行业多 GPU 模式调研
  • MULTI_GPU_COUPLING_ANALYSIS.md: 耦合度分析

实验日期: 2026-03-05
最后更新: 2026-03-05