You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CUDA无分支条件选择的收敛屏障疑问及Warp停滞分析

CUDA路径追踪渲染器的SASS指令与性能疑问

我实现了一个简单的路径追踪渲染器,通过ncu-ui对代码进行性能分析时,在CUDA编译器生成的SASS指令中发现了令人困惑的内容。

对应的C++代码片段如下:

// CPT_GPU 此处代表 '__device__'
CPT_GPU float ray_intersect(
    const Ray& ray,
    ConstShapePtr shapes,
    ConstAABBPtr s_aabbs,
    ShapeIntersectVisitor& shape_visitor,
    int& min_index,
    const int remain_prims,
    const int cp_base_5,
    float min_dist
) {
    float aabb_tmin = 0;
    #pragma unroll
    for (int idx = 0; idx < remain_prims; idx ++) {
        if (s_aabbs[idx].intersect(ray, aabb_tmin) && aabb_tmin <= min_dist) {
            shape_visitor.set_index(idx);
            float dist = variant::apply_visitor(shape_visitor, shapes[cp_base_5 + idx]);
            bool valid = dist > EPSILON && dist < min_dist;
            min_dist = valid ? dist : min_dist;
            // ---------- 疑问源于下方代码行 ----------
            min_index = valid ? cp_base_5 + idx : min_index;
        }
    }
    return min_dist;
}

这段代码逻辑明确:遍历所有三角形,找到最近的命中点。如果命中点比当前记录的最小距离更近(即valid为true),则将三角形索引记录到min_index中,否则min_index保持不变。

但生成的SASS指令中,min_index = valid ? cp_base_5 + idx : min_index;对应的指令如下:

SEL R24, R25, R24, P0      % Select Source with Predicate
BSYNC B8                   % Synchronize Threads on a Convergence Barrier

性能分析显示:

  • min_index的赋值操作导致大量warp停滞(77.51%为“无指令”,约14%为“分支解析”)
  • 循环也引发大量warp停滞(50%为“屏障”相关)

我有两个疑问:

  1. 编译器为何在此处添加BSYNC指令?代码本身无分支且无显式同步点,这个操作的作用是什么?
  2. 循环为何因屏障产生大量停滞?该屏障是什么?为何会被添加?是否是因为SIMT架构要求warp内所有线程执行相同指令,导致部分线程等待?

内容的提问来源于stack exchange,提问作者Enigmatisms

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 09:33:18