mirror of
https://github.com/L-yang-yang/cugenopt.git
synced 2026-04-25 12:16:21 +02:00
| .. | ||
| README.md | ||
E9: Multi-GPU B3 方案验证
实验目的
验证 Multi-GPU v5.0 方案 B3(被动注入)在运行期间进行解交换的有效性,对比简化版(独立运行 + 最终比较)。
实验设计
对比方案
- 简化版(Baseline): 在单 GPU 上运行多次独立
solve(),每次使用不同种子,最后选择最优解 - B3 保守策略:
interval=3s,MultiGpuInjectMode::OneIsland或HalfIslands - 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
结论
主要发现
- B3 方案未带来显著收益: 在所有测试规模上,B3(运行期间解交换)相比简化版(独立运行)的改进均在 ±0.1% 范围内,属于统计噪声
- 问题规模影响不大: 从小规模(n=50)到大规模(n=64),B3 的相对表现没有明显变化
- 注入策略影响微弱: 保守策略(3s, OneIsland)和激进策略(1s, AllIslands)的效果差异不明显
技术分析
为什么 B3 没有效果?
- 搜索空间特性: 元启发式算法的搜索轨迹高度依赖初始解和随机种子,不同 GPU 的搜索轨迹本质上是相互独立的
- 解的多样性不足: 不同 GPU 找到的最优解往往处于相似的局部最优区域,注入到其他 GPU 后无法带来新的搜索方向
- 注入时机问题: 在搜索中期注入外部解可能破坏已有的搜索动量,反而降低收敛效率
- 岛屿模型已足够: 单 GPU 内部的 16 个岛屿已经提供了足够的种群多样性
与行业实践一致
- cuOpt: NVIDIA 官方组合优化求解器不支持多 GPU
- OR-Tools: Google 的求解器不支持多 GPU
- Gurobi/CPLEX: 商业 MIP 求解器的多 GPU 支持仅限于特定算法(如 Barrier)
这些商业求解器的选择说明:对于组合优化问题,多 GPU 的投入产出比很低。
规模限制
当前测试受到以下限制:
- 编码维度:
TSPProblem的D2=64限制了最大问题规模为 n=64 - VRP 内存错误: VRP n≥50 时出现
illegal memory access,可能是 VRP 编码的内存布局问题 - 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_thread和solve_multi_gpu实现
设计文档
MULTI_GPU_EXCHANGE_DESIGN.md: 完整的方案设计和技术分析MULTI_GPU_INDUSTRY_PATTERNS.md: 行业多 GPU 模式调研MULTI_GPU_COUPLING_ANALYSIS.md: 耦合度分析
实验日期: 2026-03-05
最后更新: 2026-03-05