Skip to content

Kernel 选择策略

基于矩阵特征自动选择最优 Kernel。

选择流程

Kernel 对比

Kernel线程策略最佳场景带宽效率复杂度
Scalar CSR1 线程/行极稀疏 (nnz/row < 4)~40-50%★☆☆☆☆
Vector CSR1 Warp/行均匀分布~65-75%★★☆☆☆
Merge Path动态分块高度倾斜~70-80%★★★★★
ELL Kernel列并行行长度均匀~80-90%★★★☆☆

选择阈值

阈值默认值用途
avg_nnz_threshold4.0判断是否使用 Scalar CSR
skewness_threshold10.0判断是否使用 Merge Path
texture_cols_threshold10000启用纹理缓存的向量长度阈值

自定义阈值

cpp
SpMVThresholds thresholds = {
    .avg_nnz_threshold = 4.0f,
    .skewness_threshold = 10.0f,
    .texture_cols_threshold = 10000
};
spmv_set_thresholds(thresholds);

矩阵统计量

avg_nnz_per_row

每行平均非零元素数。低值表示极稀疏矩阵,适合 Scalar CSR。

倾斜度 (Skewness)

每行最大与最小非零元素数的比值:max / (min + 1)

  • < 10:均匀分布 → Vector CSR
  • ≥ 10:倾斜分布 → Merge Path
cpp
CSRStats stats = csr_compute_stats(csr);
printf("倾斜度: %.2f\n", stats.skewness);

性能建议

  1. 极稀疏矩阵(avg_nnz < 4):让 Scalar CSR 处理
  2. 均匀矩阵:Vector CSR 提供良好平衡
  3. 倾斜矩阵:Merge Path 确保负载均衡
  4. 行长度均匀:转换为 ELL 获得最佳性能

手动指定

你可以覆盖自动选择:

cpp
// 强制使用指定 Kernel
SpMVConfig config;
config.kernel_type = KernelType::MERGE_PATH;
config.block_size = 256;
config.use_texture = true;

SpMVResult result = spmv_csr(csr, d_x, d_y, &config);

参考

MIT License