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%为“屏障”相关)
我有两个疑问:
- 编译器为何在此处添加
BSYNC指令?代码本身无分支且无显式同步点,这个操作的作用是什么? - 循环为何因屏障产生大量停滞?该屏障是什么?为何会被添加?是否是因为SIMT架构要求warp内所有线程执行相同指令,导致部分线程等待?
内容的提问来源于stack exchange,提问作者Enigmatisms
相关产品推荐
相关产品推荐

