为何调用一次cublasSasum,asum_kernel却被nsys检测到执行两次?
cuBLAS cublasSasum 内核两次调用问题解析
我仅从cuBLAS调用一次cublasSasum函数,但通过nsys性能分析工具发现,它实际调用的asum_kernel内核被执行了两次。当前计算4096²个元素的求和操作时,nsys分析结果如下:
Time (%) Total Time (ns) Instances Avg (ns) Med (ns) Min (ns) Max (ns) StdDev (ns) Name -------- --------------- --------- ----------- ----------- --------- --------- ----------- ------------------------------------------------------------- 17.9 415,655 2 207,827.5 207,827.5 3,264 412,391 289,296.5 void asum_kernel<int, float, float>(cublasAsumParams<T2, T3>)
问题与解答
问题1:这种两次调用的情况,是否是因为该内核先执行块级归约、保存结果后,再对临时结果执行最终归约导致的?
是的,cuBLAS的cublasSasum采用两级归约逻辑:第一次内核调用将大规模数据按线程块做局部归约,把每个块的中间结果写入全局内存临时缓冲区;第二次内核对这些临时结果做最终归约,得到总和。这种设计是为了避免单线程处理全量数据的性能瓶颈,保证大尺寸计算的效率。问题2:尝试仅计算4个元素,使用4个线程和一个网格块,此时
asum_kernel仍被调用两次,明明一次就足够处理该场景了?
这是因为cuBLAS的内核是通用化实现,不会针对极小尺寸输入做特殊分支优化。哪怕只有4个元素,它依然会走默认的两级归约流程——第一次处理原始数据生成临时结果,第二次完成最终归约。为了保持代码实现的一致性、减少分支复杂度,cuBLAS没有为这种极端小场景单独调整逻辑。
内容的提问来源于stack exchange,提问作者SKPS
相关产品推荐
相关产品推荐

