Initial commit: cuGenOpt GPU optimization solver

This commit is contained in:
L-yang-yang 2026-03-20 00:33:45 +08:00
commit fc5a0ff4af
117 changed files with 25545 additions and 0 deletions

View file

@ -0,0 +1,162 @@
# E9: Multi-GPU B3 方案验证
## 实验目的
验证 Multi-GPU v5.0 方案 B3被动注入在运行期间进行解交换的有效性对比简化版独立运行 + 最终比较)。
## 实验设计
### 对比方案
1. **简化版Baseline**: 在单 GPU 上运行多次独立 `solve()`,每次使用不同种子,最后选择最优解
2. **B3 保守策略**: `interval=3s`, `MultiGpuInjectMode::OneIsland``HalfIslands`
3. **B3 激进策略**: `interval=1s`, `MultiGpuInjectMode::AllIslands`
### 测试问题
| 问题 | 规模 | 说明 |
|------|------|------|
| TSP | n=50 | 小规模基准测试 |
| TSP | n=64 | 最大支持规模(受 `Solution<1,64>` 限制) |
| VRP | n=40 | 中等规模约束问题 |
| VRP | n=50 | 较大规模约束问题(遇到内存错误) |
### 配置参数
```cpp
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. **编码维度**: `TSPProblem``D2=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_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