我有CUDA程序,其中多个内核按序列运行(在同一流中-默认流)。我想对整个程序进行性能分析,尤其是GPU部分。我正在使用nvprof工具等一些指标进行分析,例如Achieved_occupancy,inst_per_warp,gld_efficiency等。
但是,探查器会分别为每个内核提供指标值,而我想为它们全部计算指标值,以查看该程序GPU的总体使用情况。 我应该为每个指标取所有内核的(平均值,最大值或总数)吗?
答案 0 :(得分:2)
一种可能的方法是使用加权平均法。
假设我们在时间轴中有3个不重叠的内核。假设内核1运行10毫秒,内核2运行20毫秒,内核3运行30毫秒。总的来说,这3个内核在整个应用程序时间表中占用60毫秒。
让我们还假设探查器报告gld_efficiency指标如下:
kernel duration gld_efficiency
1 10ms 88%
2 20ms 76%
3 30ms 50%
您可以如下计算加权平均值:
88*10 76*20 50*30
"overall" global load efficiency = ----- + ----- + ----- = 65%
60 60 60
我确信可能还有其他有意义的方法。例如,一种更好的方法可能是让事件探查器报告每个内核的全局负载事务总数,然后基于此而不是内核持续时间进行加权:
kernel gld_transactions gld_efficiency
1 1000 88%
2 2000 76%
3 3000 50%
88*1000 76*2000 50*3000
"overall" global load efficiency = ------- + ------- + ------- = 65%
6000 6000 6000