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

延迟归一化测试

目的

验证延迟归一化Lazy Normalization机制的正确性和性能。

核心修改

1. SeqRegistry 结构

struct SeqRegistry {
    int   ids[MAX_SEQ];
    int   count;
    float weights[MAX_SEQ];   // 未归一化
    float weights_sum;        // 缓存权重和 ⭐ 新增
    float max_w[MAX_SEQ];
    SeqCategory categories[MAX_SEQ];
};

2. 轮盘赌选择

// 原来r ∈ [0, 1),要求权重归一化
float r = curand_uniform(rng);

// 现在r ∈ [0, weights_sum),不要求权重归一化
float r = curand_uniform(rng) * reg.weights_sum;

3. AOS 更新

// 原来EMA 更新 → 归一化 → FLOOR/CAP → 再次归一化
// 现在EMA 更新 → FLOOR/CAP → 更新 weights_sum不归一化

编译和运行

# 在 gpu1v100 上编译
make

# 运行测试
./test_lazy_norm

预期输出

=== 延迟归一化测试 ===

配置:
  pop_size = 32
  max_gen = 100
  aos_weight_floor = 0.050
  aos_weight_cap = 0.350
  延迟归一化: 启用

开始求解...

  [AOS batch g=10] usage: ... | w: 0.xxx 0.xxx ... | sum=0.xxx | K: ...
  [AOS batch g=20] usage: ... | w: 0.xxx 0.xxx ... | sum=0.xxx | K: ...
  ...

=== 求解完成 ===
最优解: xxx.xx
代数: 100
时间: xxx.xx ms

✅ 延迟归一化测试通过!

验证要点

  1. 权重和可能 ≠ 1.0sum=0.xxx(正常)
  2. 权重在边界内:所有 w[i] ∈ [0.05, 0.35]
  3. 求解正常完成:无崩溃、无异常
  4. 结果合理:找到可行解